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
相关产品推荐
相关产品推荐

