如何为同类型interface{}变量赋值?实现assignInterfaceTo函数
如何实现assignInterfaceTo函数使测试用例通过?
给定如下Go代码,需要编写assignInterfaceTo函数的函数体,让测试用例通过:
type testreq struct { V int32 } func assignInterfaceTo(x, y interface{}) {} func TestAssignInterfaceTo(t *testing.T) { x := &testreq{V: 1} y := &testreq{V: 2} func(arg interface{}) { assignInterfaceTo(arg, y) }(x) if x.V != y.V { t.Fatalf("\nwant: %d\nhave: %d", y.V, x.V) } }
约束条件
- 已知x和y为相同类型(无需检查类型是否一致)
- 类型可为任意结构体的指针,结构体类型未知,不能使用switch或类型断言
- 禁止使用JSON或其他编码方式进行序列化/反序列化
我的尝试
reflect.ValueOf(x).Set(reflect.ValueOf(y)):
panic: reflect: reflect.Value.Set using unaddressable valuereflect.Copy(reflect.ValueOf(x), reflect.ValueOf(y)):
panic: reflect: call of reflect.Copy on ptr Value
解决方案
问题出在直接操作指针的reflect.Value上,需要先获取指针指向的底层值(即Elem()),再进行赋值:
import "reflect" func assignInterfaceTo(x, y interface{}) { reflect.ValueOf(x).Elem().Set(reflect.ValueOf(y).Elem()) }
解释
reflect.ValueOf(x)获取的是x接口变量中存储的指针对应的reflect.Value- 调用
Elem()方法可以获取该指针指向的结构体实例的reflect.Value(此值具备可寻址性) - 对y执行同样操作,获取其指向的结构体实例的reflect.Value后,调用
Set()完成内容复制
这样就能将y指向的结构体内容完整复制到x指向的结构体中,满足测试用例的验证要求。
内容的提问来源于stack exchange,提问作者xakepp35
相关产品推荐
相关产品推荐

