【问题标题】:Deleting pointer value doesn't panic删除指针值不会恐慌
【发布时间】:2018-01-23 05:08:11
【问题描述】:

为什么下面的代码没有恐慌? 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)
}

Playground

【问题讨论】:

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

标签: pointers dictionary go


【解决方案1】:

使用内置的delete() 从地图中删除一个条目。它不会删除/解除分配与已删除键关联的值所指向的内存。

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

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

当您将代码更改为people[0].Name 时,您将使用不在地图中的键来索引地图(因为您刚刚使用delete() 将其删除),因此index expression 的结果将是map的值类型zero value*Person类型为nil。并且试图引用 nil 结构指针的 Name 字段将导致运行时恐慌。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多