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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

當(dāng)參數(shù)不是 go 中的指針時(shí),使用 reflect 通過(guò)引用更新值

當(dāng)參數(shù)不是 go 中的指針時(shí),使用 reflect 通過(guò)引用更新值

Go
一只甜甜圈 2023-03-29 15:36:50
我很難學(xué)習(xí)反射、指針和接口的基礎(chǔ)知識(shí),所以這是另一個(gè)我似乎無(wú)法弄清楚的入門(mén)級(jí)問(wèn)題。這段代碼完成了我想要它做的事情——我正在使用反射將另一條記錄添加到類(lèi)型為接口的切片中。package mainimport (  "reflect"  "log")type Person struct {  Name string}func Add(slice interface{}) {  s := reflect.ValueOf(slice).Elem()  // in my actual code, p is declared via the use of reflect.New([Type])  p := Person{Name:"Sam"}  s.Set(reflect.Append(s,reflect.ValueOf(p)))}func main() {  p := []Person{}  Add(&p)  log.Println(p)}如果我將 Add 和 main 功能更改為此,事情就不會(huì)按照我想要的方式工作。func Add(slice interface{}) {  s := reflect.ValueOf(&slice).Elem()  p := Person{Name:"Sam"}  s.Set(reflect.Append(reflect.ValueOf(slice),reflect.ValueOf(p)))  log.Println(s)}func main() {  p := []Person{}  Add(p)  log.Println(p)}也就是說(shuō),最后并沒(méi)有像我希望的那樣 log.Println(p)顯示其中包含記錄的切片。所以我的問(wèn)題是,我是否有可能收到一個(gè)不是指針的切片,并且我仍然可以在其中編寫(xiě)一些代碼來(lái)產(chǎn)生第一個(gè)場(chǎng)景中顯示的結(jié)果?SamAdd()Add()我最近的很多問(wèn)題都圍繞著這種主題,所以我仍然花了一些時(shí)間來(lái)弄清楚如何有效地使用反射包。
查看完整描述

1 回答

?
呼喚遠(yuǎn)方

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊

不,不可能在不傳遞指向切片的指針的情況下附加到函數(shù)中的切片。這與反射無(wú)關(guān),而是與變量如何傳遞給函數(shù)有關(guān)。這是相同的代碼,修改為不使用反射:


package main


import (

        "log"

)


type Person struct {

        Name string

}


func AddWithPtr(slicep interface{}) {

        sp := slicep.(*[]Person)


        // This modifies p1 itself, since *sp IS p1

        *sp = append(*sp, Person{"Sam"})

}


func Add(slice interface{}) {

        // s is now a copy of p2

        s := slice.([]Person)


        sp := &s


        // This modifies a copy of p2 (i.e. s), not p2 itself

        *sp = append(*sp, Person{"Sam"})

}


func main() {

        p1 := []Person{}

        // This passes a reference to p1

        AddWithPtr(&p1)

        log.Println("Add with pointer:   ", p1)


        p2 := []Person{}

        // This passes a copy of p2

        Add(p2)

        log.Println("Add without pointer:", p2)

}

(上面,當(dāng)它說(shuō)切片的“副本”時(shí),它并不意味著底層數(shù)據(jù)的副本 - 只是切片)


當(dāng)您傳入一個(gè)切片時(shí),該函數(shù)實(shí)際上得到一個(gè)新切片,該切片引用與原始數(shù)據(jù)相同的數(shù)據(jù)。附加到函數(shù)中的切片會(huì)增加新切片的長(zhǎng)度,但不會(huì)更改傳入的原始切片的長(zhǎng)度。這就是原始切片保持不變的原因。


查看完整回答
反對(duì) 回復(fù) 2023-03-29
  • 1 回答
  • 0 關(guān)注
  • 130 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號(hào)

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