這段代碼工作正常,但用于調(diào)用該函數(shù)的臨時變量感覺很笨重package mainimport "fmt"type Foo struct { name string value int}// SetName receives a pointer to Foo so it can modify it.func (f *Foo) SetName(name string) { f.name = name}var users = map[string]Foo{}func main() { // Notice the Foo{}. The new(Foo) was just a syntactic sugar for &Foo{} // and we don't need a pointer to the Foo, so I replaced it. // Not relevant to the problem, though. //p := Foo{} users["a"] = Foo{value: 1} x := users["a"] x.SetName("Abc") users["a"] = x fmt.Println(users)}http://play.golang.org/p/vAXthNBfdP
2 回答

慕雪6442864
TA貢獻1812條經(jīng)驗 獲得超5個贊
抱歉不行。在 Go 中,指針通常是透明的,當(dāng)你對它們調(diào)用指針方法時,值會自動尋址。您設(shè)法找到了少數(shù)沒有的情況之一。這種情況是地圖存儲——地圖中的值不被認為是可尋址的。也就是說,你永遠做不到val := &map[key]
。
當(dāng)你val := Typ{}
定義了一個值和方法時*Typ
,當(dāng)你嘗試調(diào)用val.Method()
Go 時會超級偷偷地做(&val).Method()
。既然你不能做&map[key]
,那么這不起作用,所以你做的臨時可變舞蹈是唯一的方法。
至于為什么會這樣,地圖的內(nèi)部結(jié)構(gòu)對于用戶來說被認為有點秘密,因為它是一個哈希圖,它保留重新分配自身、隨機數(shù)據(jù)等的權(quán)利,允許您獲取任何破壞該地址的值的地址. 已經(jīng)考慮過允許這種特定情況起作用的建議(即:調(diào)用帶有指針接收器的方法),因為修復(fù)非常簡單,但尚未被接受。也許有一天會被允許,但不是現(xiàn)在。
- 2 回答
- 0 關(guān)注
- 199 瀏覽
添加回答
舉報
0/150
提交
取消