1 回答
TA贡献1802条经验 获得超5个赞
您几乎不应该使用指向接口的指针。我的建议是永远不要使用它,当你需要它时,你就会知道。
相反,如果你需要一个指向某物的指针(这样你就可以在多个地方拥有相同的指针,因此在某处修改指向的值,它会对其他地方产生影响),在接口值中“包装指针”。
因此,首先修改该items字段,使其存储interface{}值而不是指针:
items map[string]interface{}
这意味着没有限制:您可以传递和存储指针,这不是问题。
接下来修改Get()返回interface{}:
func (cls *Container) Get(value string) interface{}{
return cls.items[value]
}
并且在 中Put(),不要获取以下地址interface{}:
func (cls *Container) Put(value string, a int64) {
res := cls.GetMysql(value, a)
cls.items[value] = res
}
并且您必须*Member根据 返回的值进行类型断言Get()。
现在测试它:
c := Container{outerType: Member{}}
c.items = make(map[string]interface{})
c.Put("Jack", 500)
res := c.Get("Jack")
fmt.Println(res)
m := res.(*Member) // Here is the problem. How to convert ?
fmt.Println(m)
输出(在Go Playground上尝试):
&{0 Jack 500 0}
&{0 Jack 500 0}
现在,如果您要修改以下字段m:
m.Credit = 11
然后从缓存中获取值:
fmt.Println(c.Get("Jack"))
我们将看到修改后的值,即使我们没有调用(在Go PlaygroundPut()上尝试):
&{0 Jack 11 0}
- 1 回答
- 0 关注
- 138 浏览
添加回答
举报