1 回答

TA貢獻1858條經驗 獲得超8個贊
您幾乎不應該使用指向接口的指針。我的建議是永遠不要使用它,當你需要它時,你就會知道。
相反,如果你需要一個指向某物的指針(這樣你就可以在多個地方擁有相同的指針,因此在某處修改指向的值,它會對其他地方產生影響),在接口值中“包裝指針”。
因此,首先修改該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 關注
- 125 瀏覽
添加回答
舉報