2017-08-15 128 views
0

为什么下面的代码不会惊慌? 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

+0

问题中的代码与操场中的代码不同。你问哪一个? – Art

回答

5

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

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

您的代码不会因为您有一个指向Person类型值的(有效)指针而发生恐慌,并且只要您拥有该指针,该人就不会失效(其内存不会被释放)。

当你改变你的代码people[0].Name,那么你索引用钥匙这是不是在地图上(因为你只是delete()删除它)的地图,所以index expression的结果将是价值的zero value地图类型,nil*Person类型。并试图参考nil结构指针的Name字段将导致运行时恐慌。