Go语言如何将interface传入struct并调用接口方法解决空指针panic
错误根源
- Go的接口是基于类型方法的隐式实现,你定义的全局
sayHello()是顶级函数,没有绑定到任何自定义类型,不存在满足Person接口的类型实例。 - 你初始化
foo实例时,person字段未赋值,接口类型的零值为nil,调用nil接口的方法会直接触发空指针panic。
修复方案
- 定义自定义类型,为其实现
Person接口要求的sayHello()方法 - 初始化
Foo实例时,为person字段赋值为上述自定义类型的实例
完整可运行代码
package main import ( "fmt" "time" ) type Person interface { sayHello() } // 定义实现Person接口的自定义类型 type User struct{} // 绑定sayHello方法,自动满足Person接口要求 func (u User) sayHello() { fmt.Printf("hello\n") } type Foo struct { num int person Person } var FooChan = make(chan *Foo, 200) func say() { for { select { case f := <-FooChan: f.person.sayHello() fmt.Printf("num %v\n", f.num) } } } func main() { var foo Foo foo.num = 2 // 为person字段赋值为实现了接口的实例 foo.person = User{} FooChan <- &foo go say() time.Sleep(10 * time.Second) }
补充说明
即使Person接口定义在其他文件,只要当前包可以访问到该接口定义,你的自定义类型实现了接口的所有方法,就可以自动适配接口,不需要额外声明。
内容的提问来源于stack exchange,提问作者Yongqi Z
相关产品推荐
相关产品推荐

