我有以下代碼模擬我正在處理的代碼的結(jié)構(gòu)。主要思想是該ListOf函數(shù)接收一些結(jié)構(gòu)的數(shù)組,并用使用反射創(chuàng)建的元素填充它。結(jié)構(gòu)的類型未知,因此它必須與“任何”類型一起使用,這就是參數(shù)list作為interface{}. 這部分似乎在工作:創(chuàng)建元素并將其附加到數(shù)組。在附加到數(shù)組之前,必須將元素傳遞給SetValue需要指向結(jié)構(gòu)的指針的函數(shù),以便修改它接收的結(jié)構(gòu)。在下面的代碼中,我正在模擬這個函數(shù),它的內(nèi)部邏輯是不相關(guān)的,因為 我不控制這個函數(shù)。我無法更改它,而且據(jù)我測試,如果此函數(shù)接收到指向結(jié)構(gòu)的指針,它會按預(yù)期工作。但是,我一直無法找到一種方法將指向新創(chuàng)建的結(jié)構(gòu)的指針傳遞給函數(shù)SetValue。當(dāng)我運行下面的代碼時,出現(xiàn)以下錯誤:恐慌:接口轉(zhuǎn)換:接口 {} 是 main.MyStruct,而不是 *main.MyStruct我的問題是,如何修改才能ListOf將 a 傳遞*main.MyStruct給SetValue函數(shù)。顯然我在這里遺漏了一些簡單的東西。這是代碼。您可以在 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條經(jīng)驗 獲得超4個贊
New
返回一個帶有 的值*main.MyStruct
。將該值傳遞給 SetValue:
v := reflect.New(e) SetValue(v.Interface())
https://go.dev/play/p/vJwbfGj7YZF
- 1 回答
- 0 關(guān)注
- 165 瀏覽
添加回答
舉報
0/150
提交
取消