Pointers 删除指针值不需要';不要惊慌
为什么下面的代码没有死机<代码>测试绝对是一个指针。使用Pointers 删除指针值不需要';不要惊慌,pointers,dictionary,go,Pointers,Dictionary,Go,为什么下面的代码没有死机测试绝对是一个指针。使用fmt.Println(people[0].Name)而不是fmt.Println(test.Name) package main import "fmt" func main() { type Person struct { Id int Name string } people := make(map[int]*Person) people[1] = &Per
fmt.Println(people[0].Name)
而不是fmt.Println(test.Name)
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)
}
使用内置项可从地图中删除条目。它不会删除/取消分配与已删除键关联的值所指向的内存
在Go中,您不能像这样管理内存,Go是一种垃圾收集语言,释放内存是垃圾收集器的职责
您的代码不会死机,因为您有一个指向Person
类型的值的(有效)指针,只要您有它,这个人就不会变得无效(其内存不会被释放)
当您将代码更改为people[0].Name
时,您正在使用一个不在映射中的键对映射进行索引(因为您刚刚使用delete()
将其删除),因此结果将是映射的值类型的值,对于*Person
类型,该值类型为nil
。试图引用nil
struct指针的Name
字段将导致运行时死机。使用内置项将从映射中删除条目。它不会删除/取消分配与已删除键关联的值所指向的内存
在Go中,您不能像这样管理内存,Go是一种垃圾收集语言,释放内存是垃圾收集器的职责
您的代码不会死机,因为您有一个指向Person
类型的值的(有效)指针,只要您有它,这个人就不会变得无效(其内存不会被释放)
当您将代码更改为
people[0].Name
时,您正在使用一个不在映射中的键对映射进行索引(因为您刚刚使用delete()
将其删除),因此结果将是映射的值类型的值,对于*Person
类型,该值类型为nil
。试图引用nil
struct指针的Name
字段将导致运行时恐慌。您问题中的代码与操场中的代码不同。你问的是哪一个?你问题中的代码与操场上的代码不同。你问的是哪一个?