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

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

獲取指向在 golang 中使用反射創建的結構的指針

獲取指向在 golang 中使用反射創建的結構的指針

Go
肥皂起泡泡 2023-02-21 16:30:23
我有以下代碼模擬我正在處理的代碼的結構。主要思想是該ListOf函數接收一些結構的數組,并用使用反射創建的元素填充它。結構的類型未知,因此它必須與“任何”類型一起使用,這就是參數list作為interface{}. 這部分似乎在工作:創建元素并將其附加到數組。在附加到數組之前,必須將元素傳遞給SetValue需要指向結構的指針的函數,以便修改它接收的結構。在下面的代碼中,我正在模擬這個函數,它的內部邏輯是不相關的,因為 我不控制這個函數。我無法更改它,而且據我測試,如果此函數接收到指向結構的指針,它會按預期工作。但是,我一直無法找到一種方法將指向新創建的結構的指針傳遞給函數SetValue。當我運行下面的代碼時,出現以下錯誤:恐慌:接口轉換:接口 {} 是 main.MyStruct,而不是 *main.MyStruct我的問題是,如何修改才能ListOf將 a 傳遞*main.MyStruct給SetValue函數。顯然我在這里遺漏了一些簡單的東西。這是代碼。您可以在 Go Playground 嘗試一下。提前致謝。package mainimport (         "fmt"         "reflect")type MyStruct struct {     Metadata struct {        Name string    }}// Expects a pointer to an struct and modifies itfunc SetValue(obj interface{}) {    // This code mocks the logic that modifies the generic objects    // It only shows that I need a pointer in order to modify obj    // I don't control this logic.    s := obj.(*MyStruct)    s.Metadata.Name = "name"}func ListOf(list interface{}) {    // type of the elements of the list (main.MyStruct)    e := reflect.TypeOf(list).Elem().Elem()    // new value of type main.MyStruct    v := reflect.New(e)    // Call SetName, here is where I need *main.MyStruct    SetValue(v.Elem().Interface())    // value of list used below    l := reflect.ValueOf(list).Elem()    // append new value to list    l.Set(reflect.Append(l, v.Elem()))}func main() {    list := []MyStruct{}    ListOf(&list)    fmt.Printf("%v", list)}
查看完整描述

1 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

New返回一個帶有 的值*main.MyStruct。將該值傳遞給 SetValue:

v := reflect.New(e)
SetValue(v.Interface())

https://go.dev/play/p/vJwbfGj7YZF


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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