登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-21 08:18:29 440浏览 收藏

在 Go 中,通过值接收器(func (w work) dosome())调用的函数接收结构的副本。因此,对副本进行的修改不会反映在原始结构中,导致映射被初始化为 nil。要解决此问题,可以使用指针接收器(func (w *work) doSome()),以便将原始结构作为指针传递给函数,或者在初始化结构时预先初始化映射。

问题内容

我确信对此有一个很好的解释,但我一直找不到。谁能帮我理解下面的代码示例发生了什么?

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)
    }
}

这打印出 data is nil,这不是我所期望的。如果我将其修改为 dosome 方法的指针类型(即 *work),它将初始化结构体的变量。我想了解为什么这些不同。我认为这与 map 作为指针有关,但一直无法找到一个很好的参考来解释这一点。

演示链接 - https://play.golang.org/p/ltn11trkrnj


解决方案


通过值接收器 (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()
}

到这里,我们也就讲完了《在 Go 中为非指针类型函数初始化映射》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>