2 回答

TA貢獻1874條經驗 獲得超12個贊
嘗試這個:
func ModifyIt(slice interface{}, fieldName string, newVal interface{}) {
? ? // Create a value for the slice.
? ? v := reflect.ValueOf(slice)
? ? // Get the first element of the slice.
? ? e := v.Index(0)
? ? // Get the field of the slice element that we want to set.
? ? f := e.FieldByName(fieldName)
? ? // Set the value!
? ? f.Set(reflect.ValueOf(newVal))
}
像這樣稱呼它:
p := []Person{Person{Name: "john"}}
c := []Car{Car{"corolla"}, Car{"jetta"}}
ModifyIt(p, "Cars", c)
請注意,調用直接傳遞切片而不是使用指向切片的指針。不需要指針并增加了額外的復雜性。

TA貢獻1853條經驗 獲得超9個贊
純粹出于運氣,我終于得到了一些工作。
我拼湊了一堆隨機閱讀的東西,幾乎沒有韻律或理由。我什至嘗試閱讀 Golang 網站上的反射法則,但我認為我沒有很好地理解它與為什么我不能將變量類型設置為interface{}. 總的來說,我還是不明白我做了什么。
我在下面的解決方案中充斥著評論,表明我很困惑,并且對我是否正確或安全地做事缺乏信心。
package main
import (
"reflect"
"log"
)
type Car struct {
Model string
}
type Person struct {
Name string
Cars []Car
}
func ModifyIt(parent interface{},fieldName string, val interface{}) {
log.Println(parent)
slice := reflect.ValueOf(parent).Elem()
nth := slice.Index(0)
row := nth.Interface()
log.Println(nth.CanSet()) // I can set this nth item
// I think I have a to make a copy, don't fully understand why this is necessary
newitem := reflect.New(reflect.ValueOf(row).Type())
newelem := newitem.Elem()
field := newelem.FieldByName(fieldName)
// I need to copy the values over from the old nth row to this new item
for c:=0; c<nth.NumField(); c++ {
newelem.Field(c).Set(reflect.Indirect(nth.Field(c)))
}
// now I can finally set the field for some reason I don't understand
field.Set(reflect.ValueOf(val).Elem())
// now that newitem has new contents in the field object, I need to overwrite the nth item with new item
// I don't know why I'm doing it, but I'll do it
// I also don't fully understand why I have to use Indirect sometimes, and not other times...it seems interchangeable with ValueOf(something).Elem(), I'm confused....
nth.Set(reflect.Indirect(newitem))
}
func main() {
p := []Person{Person{Name:"john"}}
c := []Car{Car{"corolla"},Car{"jetta"}}
ModifyIt(&p,"Cars",&c)
// now parent is up to date, although I have no idea how I got here.
log.Println(p)
}
如果有人可以發布更好的答案來消除我的困惑,那就太好了。我一直很難學習 golang。
- 2 回答
- 0 關注
- 125 瀏覽
添加回答
舉報