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

Go中如何调用实现接口的结构体绑定函数?为何需传结构体指针?

问题解答

1. 如何执行runFunc对应的函数

你当前打印structObj.runFunc输出十六进制地址,是因为你直接打印的是函数类型变量本身,函数类型变量存储的就是函数的入口地址。要执行对应函数,只需要在变量后加调用括号()即可,你的Run方法返回字符串,可以直接打印调用结果。
只需修改main函数中对应的打印逻辑:

func main(){
    var structObj *Struct
    Obj1 := Obj1{}
    Obj2 := Obj2{}
    structObj = New(&Obj1)
    fmt.Println(structObj.name)
    // 调用runFunc方法
    fmt.Println(structObj.runFunc())
    structObj = New(&Obj2)
    fmt.Println(structObj.runFunc())
}

修改后运行输出为:

Obj1
Obj1 run func
Obj2 run func

2. 为什么需要传入结构体地址

这是由Go语言的方法集规则决定的:

  • 对于自定义值类型T,它的方法集仅包含所有接收器为T的方法
  • 对于指针类型*T,它的方法集包含所有接收器为T和*T的方法
    你代码中Obj1、Obj2的所有方法接收器都是指针类型*Obj1、*Obj2,因此只有这两个结构体的指针类型才完整实现了IStruct接口,如果你直接传Obj1值类型实例,编译器会直接报错提示该类型没有实现IStruct接口。
    如果你希望传值类型也能适配接口,只需要把所有方法的接收器改为值类型即可;但如果方法内需要修改结构体成员、或者结构体占用内存较大,一般还是推荐使用指针接收器。

内容的提问来源于stack exchange,提问作者Just a human

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:27:04