登录
首页 >  Golang >  Go问答

创建一个只包含函数成员的空接口变量

来源:stackoverflow

时间:2024-03-20 13:00:32 183浏览 收藏

在创建需要函数回调的类型时,可能会遇到变量初始化问题。例如,需要具有 setpacketfunc 回调的 repeater 类型,而此类型应作为参数传递给另一个函数。如果不正确定义 repeater 类型,在运行时可能会收到错误消息,提示无效内存地址或 nil 指针取消引用。

问题内容

我正在尝试实现一种需要函数回调的类型,但我陷入了变量初始化的困境。 terminal.new() 类型需要具有 setpacketfunc 回调的 repeater 类型。这是在 terminal.new 中定义的:

//Package dmr
type Repeater interface {
    Active() bool
    Close() error
    ListenAndServe() error
    Send(*Packet) error

    GetPacketFunc() PacketFunc
    SetPacketFunc(PacketFunc)
}
//Package terminal
func New(id uint32, call string, r dmr.Repeater) *Terminal {
    t := &Terminal{
        ID:       id,
        Call:     call,
        Repeater: r,
        slot:     []*Slot{NewSlot(), NewSlot(), NewSlot()},
        accept:   map[uint32]bool{id: true},
    }

    r.SetPacketFunc(t.handlePacket)
    return t
}

在我的代码中,我正在初始化一个空的 repeater 类型变量: var r dmr.repeater 然后将其作为参数传递给 t :=terminal.new(123,"test",r)。但是在运行时,我在代码中的 terminal.new 行收到 panic: 运行时错误:无效的内存地址或 nil 指针取消引用

如果 repeater 的所有成员都是函数,如何正确定义 repeater 类型?


解决方案


当您定义变量 r 时,它会被初始化为零值,对于接口来说,即 nil。因此,当您调用 setpacketfunc 时,该函数的接收者为 nil,从而给出该错误。

您必须传递一个具体的转发器,或指向转发器的具体实现的转发器接口:

var r = SomeRepeaterImpl{}

func f() {
   term:=terminal.New(123,"test",&r)
}

好了,本文到此结束,带大家了解了《创建一个只包含函数成员的空接口变量》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>