gpt4 book ai didi

go - 无法设置类型为接口(interface)的结构的字段{}

转载 作者:数据小太阳 更新时间:2023-10-29 03:02:56 26 4
gpt4 key购买 nike

我一直在与 reflect 包作斗争。下面的代码符合我的预期:

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{}) {
slice := reflect.ValueOf(parent).Elem()
nth := slice.Index(0)
//row := nth.Interface() // this line causes errors
row := nth.Interface().(Person)
elem := reflect.ValueOf(&row).Elem()
field := elem.FieldByName(fieldName)
log.Println(field.CanSet())

}

func main() {

p := []Person{Person{Name:"john"}}
c := []Car{Car{"corolla"},Car{"jetta"}}

ModifyIt(&p,"Cars",&c)
}

但是,如果我将行 row := nth.Interface().(Person) 替换为 row := nth.Interface(),那就是我删除了类型断言,然后我得到错误:

panic: reflect: call of reflect.Value.FieldByName on interface Value on line "field := elem.FieldByName(fieldName)

在过去的几个小时里,我尝试了很多其他的事情,比如尝试在一些其他变量但没有成功。

我读过一些其他类似的问题:

reflect: call of reflect.Value.FieldByName on ptr Value

Set a struct field with field type of a interface

Golang reflection: Can't set fields of interface wrapping a struct

他们似乎暗示我对指针或接口(interface)的工作原理没有很好的理解。

所以我的问题是,当结构被键入为接口(interface)时,我该如何设置结构的字段?


更新

我发布了一个解决方案作为答案,但我不确定它是否是正确或安全的做事方式。我希望有人可以解释或发布更好的解决方案。

最佳答案

试试这个:

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)

请注意,调用直接传递 slice 而不是使用指向 slice 的指针。不需要指针并增加了额外的复杂性。

Run it on the Playground .

关于go - 无法设置类型为接口(interface)的结构的字段{},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52124137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com