亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

了解切片索引語義

了解切片索引語義

Go
開心每一天1111 2022-08-30 21:56:04
這個問題的答案可能是“好吧,這就是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]


查看完整回答
反對 回復 2022-08-30
  • 1 回答
  • 0 關注
  • 85 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號