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
字段将导致运行时恐慌。

您问题中的代码与操场中的代码不同。你问的是哪一个?你问题中的代码与操场上的代码不同。你问的是哪一个?