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

Go语言如何将interface传入struct并调用接口方法解决空指针panic

错误根源

  1. Go的接口是基于类型方法的隐式实现,你定义的全局sayHello()是顶级函数,没有绑定到任何自定义类型,不存在满足Person接口的类型实例。
  2. 你初始化foo实例时,person字段未赋值,接口类型的零值为nil,调用nil接口的方法会直接触发空指针panic。

修复方案

  1. 定义自定义类型,为其实现Person接口要求的sayHello()方法
  2. 初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:15:01