You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为同类型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 value
  • reflect.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())
}

解释

  1. reflect.ValueOf(x)获取的是x接口变量中存储的指针对应的reflect.Value
  2. 调用Elem()方法可以获取该指针指向的结构体实例的reflect.Value(此值具备可寻址性)
  3. 对y执行同样操作,获取其指向的结构体实例的reflect.Value后,调用Set()完成内容复制

这样就能将y指向的结构体内容完整复制到x指向的结构体中,满足测试用例的验证要求。


内容的提问来源于stack exchange,提问作者xakepp35

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:06:24