pointers - 删除指针值不会 panic

标签 pointers dictionary go

为什么下面的代码不会出现 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)
}

Playground

最佳答案

内置函数的使用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/

相关文章:

pointers - "cannot take the address of"和 "cannot call pointer method on"

go - 返回对象中的所有内容

c++ - 查找指向数组最大值的指针

c - 这只是调用 gets 时的错误吗?

python - 如何删除 'NoneType' 的字典项?

go - Go 接口(interface)如何支持类型信息?

c - 使用指针的段错误 (SIGSEGV)

C 引用在 for 循环之后消失

python - 试图从字典列表中删除重复的字典值

java - 哪种方法是最好的?