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

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

當參數不是 go 中的指針時,使用 reflect 通過引用更新值

當參數不是 go 中的指針時,使用 reflect 通過引用更新值

Go
一只甜甜圈 2023-03-29 15:36:50
我很難學習反射、指針和接口的基礎知識,所以這是另一個我似乎無法弄清楚的入門級問題。這段代碼完成了我想要它做的事情——我正在使用反射將另一條記錄添加到類型為接口的切片中。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 功能更改為此,事情就不會按照我想要的方式工作。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)}也就是說,最后并沒有像我希望的那樣 log.Println(p)顯示其中包含記錄的切片。所以我的問題是,我是否有可能收到一個不是指針的切片,并且我仍然可以在其中編寫一些代碼來產生第一個場景中顯示的結果?SamAdd()Add()我最近的很多問題都圍繞著這種主題,所以我仍然花了一些時間來弄清楚如何有效地使用反射包。
查看完整描述

1 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

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


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)

}

(上面,當它說切片的“副本”時,它并不意味著底層數據的副本 - 只是切片)


當您傳入一個切片時,該函數實際上得到一個新切片,該切片引用與原始數據相同的數據。附加到函數中的切片會增加新切片的長度,但不會更改傳入的原始切片的長度。這就是原始切片保持不變的原因。


查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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