删除指针值不会引起恐慌

Dav*_*vid 0 dictionary pointers go

为什么以下代码没有恐慌?test绝对是一个指针.随着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)
}
Run Code Online (Sandbox Code Playgroud)

操场

icz*_*cza 5

使用内置函数delete()会从地图中删除条目.它不会删除/取消分配与删除的键关联的值所指向的内存.

在Go中你无法管理这样的内存,Go是一种垃圾收集语言,释放内存是垃圾收集器的职责和责任.

你的代码不会因为你有一个(有效的)指向类型值的指针而感到恐慌Person,只要你拥有它,那个人就不会变得无效(它的内存不会被释放).

当您将代码更改为people[0].Name,然后您使用不在地图中的键索引地图(因为您刚刚将其删除delete()),因此索引表达式的结果将是地图的值类型的零值,这是nil*Person类型.并且尝试引用结构指针的Name字段nil将导致运行时混乱.