1 回答

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
您幾乎不應(yīng)該使用指向接口的指針。我的建議是永遠(yuǎn)不要使用它,當(dāng)你需要它時(shí),你就會(huì)知道。
相反,如果你需要一個(gè)指向某物的指針(這樣你就可以在多個(gè)地方擁有相同的指針,因此在某處修改指向的值,它會(huì)對(duì)其他地方產(chǎn)生影響),在接口值中“包裝指針”。
因此,首先修改該items字段,使其存儲(chǔ)interface{}值而不是指針:
items map[string]interface{}
這意味著沒(méi)有限制:您可以傳遞和存儲(chǔ)指針,這不是問(wèn)題。
接下來(lái)修改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根據(jù) 返回的值進(jìn)行類(lèi)型斷言Get()。
現(xiàn)在測(cè)試它:
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}
現(xiàn)在,如果您要修改以下字段m:
m.Credit = 11
然后從緩存中獲取值:
fmt.Println(c.Get("Jack"))
我們將看到修改后的值,即使我們沒(méi)有調(diào)用(在Go PlaygroundPut()上嘗試):
&{0 Jack 11 0}
- 1 回答
- 0 關(guān)注
- 134 瀏覽
添加回答
舉報(bào)