登录
首页 >  Golang >  Go问答

如何初始化具有默认值为 nil 的私有字段,当该值有用时?

来源:stackoverflow

时间:2024-02-14 23:24:25 129浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《如何初始化具有默认值为 nil 的私有字段,当该值有用时?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我试图遵循 go 谚语“让零值有用”,但遇到了结构体上默认为 nil (如 map)的私有字段的问题。如果我的结构的零值有用,则在某些时候它需要初始化私有字段。考虑以下情况,我想取消 response 的构造函数,并使 response 的零值有用。显然,字段 bag (这是一个 map[string]interface{})需要初始化。当在 response 上调用 getter bag() 时,我尝试初始化字段 bag ,它可以工作,并允许然后在包上调用 set() 来设置值。但不知怎的,当响应最终回到主函数时,我的价值就丢失了。 我认为问题在于我提出的初始化替换了 response 副本上的指针,而不是更改指针指向的内容。所以旧的指针仍然指向nil,但我不确定。如何在没有构造函数的情况下正确初始化私有字段?

func main() {
    response := getResponse()
    number := response.Bag().Get("NiceNumber")
    fmt.Println(response.Name, "tells me that your nice number today is:", number)
}

func getResponse() (response Response) {
    response = newResponse() // I am trying to do away with this line.
    response.Name = "MyResponse"
    response.Bag().Set("NiceNumber", 100)
    return
}

type Response struct {
    Name string
    bag  Bag
}

func (r Response) Bag() Bag {
    // I have added this piece of code as an attempt to initialize r.bag
    if r.bag == nil {
        r.bag = Bag(make(map[string]interface{}))
    }
    // ---
    return r.bag
}

type Bag map[string]interface{}

func (b Bag) Set(name string, value interface{}) {
    b[name] = value
}

func (b Bag) Get(name string) interface{} {
    return b[name]
}

// This constructor would be deleted if possible.
func newResponse() Response {
    return Response{
        Name: "",
        bag:  Bag(make(map[string]interface{})),
    }
}

现在的输出是 myresponse 告诉我你今天的好号码是:100,当我删除对 response 构造函数的调用时,输出是 myresponse 告诉我你今天的好号码是:


正确答案


您可以将 bag() 方法的接收器更改为指针。

func (r *Response) Bag() Bag {
    if r.bag == nil {
        r.bag = Bag(make(map[string]interface{}))
    }
    return r.bag
}

请注意,只要该值可寻址,您仍然可以对非指针值调用指针接收器方法。请参阅 Calls 上的文档:

如果 x(的类型)的方法集,则方法调用 x.m() 有效 包含 m 并且参数列表可以赋值给形参列表 米。如果 x 是可寻址的并且 &x 的方法集包含 m,则 x.m() 是 (&x).m() 的简写

到这里,我们也就讲完了《如何初始化具有默认值为 nil 的私有字段,当该值有用时?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

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