为什么下面的代码不会出现 panic? test
绝对是一个指针。使用 fmt.Println(people[0].Name)
而不是 fmt.Println(test.Name)
它会出现 panic 。
package main
import "fmt"
func main() {
type Person struct {
Id int
Name string
}
people := make(map[int]*Person)
people[1] = &Person{0, "Name"}
fmt.Println(people[0].Name)
test := people[0]
test.Name = "Name2"
fmt.Println(test.Name)
people[0].Name = "Name3"
fmt.Println(test.Name)
delete(people, 0)
fmt.Println(test.Name)
}
最佳答案
内置函数的使用delete()
从 map 中删除一个条目。它不会删除/解除分配与已删除键关联的值指向的内存。
在 Go 中你不能这样管理内存,Go 是一种垃圾收集语言,释放内存是垃圾收集器的职责。
你的代码不会 panic ,因为你有一个(有效的)指针指向 Person
类型的值,只要你有它,那个人就不会变得无效(它的内存不会被释放)。
当您将代码更改为 people[0].Name
时,您正在使用不在 map 中的键索引 map (因为您刚刚使用 delete( )
),所以 index expression 的结果将是 zero value map 的值类型,对于 *Person
类型为 nil
。并且尝试引用 nil
结构指针的 Name
字段将导致运行时 panic 。
关于pointers - 删除指针值不会 panic ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45690134/