第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

“range”返回的迭代值的數(shù)據(jù)類型是什么?

“range”返回的迭代值的數(shù)據(jù)類型是什么?

Go
慕娘9325324 2023-08-14 17:53:10
type Student struct {    Name string    Age  int}func main() {    data := make([]*Student, 0)    src := []Student{        Student{Name: "allen", Age: 30},        Student{Name: "tom", Age: 33},    }    for _, m := range src {        data = append(data, &m) // notice point!!!    }    for _, s := range data {        fmt.Println(*s)    }}為什么這段代碼在 Go 中可以運行?輸出與預(yù)期相反,如下所示。{tom 33}{tom 33}代替{allen 30}{tom 33}我發(fā)現(xiàn)的一個解釋是m是一個固定指針,因此每次append(data,&m)只附加 的地址m,該地址在迭代期間保持不變。然而,根據(jù)這個解釋,m似乎是 of *Student,所以&m是 of **Student,但是如何將一個 value( &m)**Student追加到一個數(shù)組中呢[]*Student?
查看完整描述

3 回答

?
溫溫醬

TA貢獻(xiàn)1752條經(jīng)驗 獲得超4個贊

當(dāng)范圍覆蓋切片時,每次迭代都會返回兩個值。第一個是索引,第二個是該索引處元素的副本。

因此,它具有您正在迭代的數(shù)組/切片的值。

在你的情況下,該值是一個Student結(jié)構(gòu)


查看完整回答
反對 回復(fù) 2023-08-14
?
慕田峪7331174

TA貢獻(xiàn)1828條經(jīng)驗 獲得超13個贊

實際上這與 Go 中一切都是按值傳遞這一事實有關(guān)。


m := range src

m始終是相同的引用,并且其值會更新。查看它的一個簡單方法是打印地址


for _, m := range src {

? ? // ---

? ? p := &m

? ? fmt.Printf("%p\n", p)

? ? // ---

? ? data = append(data, &m) // notice point!!!

}

查看完整回答
反對 回復(fù) 2023-08-14
?
慕的地10843

TA貢獻(xiàn)1785條經(jīng)驗 獲得超8個贊

首先,你可以通過內(nèi)省來找出真相m。另外,您可以在循環(huán)之前聲明它 ( var m ...) 作為實驗。

現(xiàn)在,你寫“我發(fā)現(xiàn) m 是一個固定指針”。首先,我不確定你所說的“固定指針”是什么意思,我也不認(rèn)為你是這樣的。固定(或常量)的是 的地址m。結(jié)論是“因此每次都append(data,&m)只是附加地址m”,這正是發(fā)生的情況。然而,你的假設(shè)“m似乎是*Student”是有缺陷的,而是m類型Student,就這么簡單。


查看完整回答
反對 回復(fù) 2023-08-14
  • 3 回答
  • 0 關(guān)注
  • 224 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號