這個問題的答案可能是“好吧,這就是Go的方式”,但我想了解以下行為背后的原因,即索引值類型的切片:package mainimport ( "fmt")type S struct { Data string}func main() { s := []S{ {"first"}, {"second"}, {"third"}, } // # 1 // This does not modify "s" first := s[0] first.Data = "something else" fmt.Println(s) // # 2 // ...but this does? s[0].Data = "woah" fmt.Println(s) // # 3 // ...and this makes sense but feels inconsistent with the previous block second := &s[1] second.Data = "this makes sense" fmt.Println(s)}我的問題是,為什么更新給定的切片編譯但不編譯?#2var element S = s[0]var element *S = s[0]
1 回答

藍山帝景
TA貢獻1843條經驗 獲得超7個贊
first := s[0]創建 的副本 并賦值給 ,類型為 。s[0]firstS
s[0].Data = "woah"是直接分配,非常簡單。
second := &s[1]將指針指定給 ,類型為 。因此修改,因為它是一個指針。請注意,Go 將點同時用于成員訪問和指針訪問(在 C 中,這將是運算符)。s[1]second*Ssecond.Datas[1].Data->
編寫和理解這一點的等效方法是:
var first S
first = s[0]
var second *S
second = &s[1]
- 1 回答
- 0 關注
- 85 瀏覽
添加回答
舉報
0/150
提交
取消