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