我有以下代碼模擬我正在處理的代碼的結構。主要思想是該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
- 1 回答
- 0 關注
- 167 瀏覽
添加回答
舉報
0/150
提交
取消