Dictionary 在Go中的非指针类型函数中初始化映射

Dictionary 在Go中的非指针类型函数中初始化映射,dictionary,go,pointers,struct,Dictionary,Go,Pointers,Struct,我相信这有一个很好的解释,但我一直没有找到它。有人能帮我理解下面的代码示例发生了什么吗 package main import ( "fmt" ) type work struct { data map[string]string } func (w work) doSome() { w.data = make(map[string]string) w.data["k1"] = "v1" } fu

我相信这有一个很好的解释,但我一直没有找到它。有人能帮我理解下面的代码示例发生了什么吗

package main

import (
    "fmt"
)

type work struct {
    data map[string]string
}

func (w work) doSome() {
    w.data = make(map[string]string)
    w.data["k1"] = "v1"
}

func main() {
    work := work{}
    work.doSome()
    if work.data == nil {
        fmt.Println("data is nil")
    } else {
        fmt.Println("data is", work.data)
    }
}
这打印出的
数据为nil
,这不是我所期望的。如果我将其修改为
doSome
方法的指针类型(即
*work
),它将初始化结构的变量。我想了解为什么这些是不同的。我假设这与
map
是指针有关,但我还没有找到一个好的参考来解释这一点

操场链接-

使用值接收器(
func(w work)doSome()
)函数获取
work
结构的副本。当它设置
w.data
时,它是为该副本设置的,而不是为
main
中声明的
work
实例设置的

映射本质上是引用类型,因此,如果您在main中初始化映射,这将起作用:

func (w work) doSome() {
    w.data["k1"] = "v1"
}

func main() {
    work := work{data:map[string]string{}}
    work.doSome()
}
或者,您应该使用指针接收器,以便将
main
中声明的
work
作为指针发送到
doSome

func (w *work) doSome() {
    w.data = make(map[string]string)
    w.data["k1"] = "v1"
}

func main() {
    work := work{}
    work.doSome()
}

我想我在这里找到了我想要的答案:。“如果方法需要改变接收器,接收器必须是指针。”谢谢!关于函数获取结构副本的注释就是我想要的!