【问题标题】:Initialising empty interface vars where all members are functions初始化所有成员都是函数的空接口变量
【发布时间】:2020-08-05 08:25:49
【问题描述】:

我正在尝试实现一个需要函数回调的类型,并且被变量初始化卡住了。类型 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
}

在我的代码中,我正在初始化一个空的中继器类型变量: var r dmr.Repeater 然后将其作为参数传递给t := terminal.New(123,"test",r)。但是在运行时,我在代码中的terminal.New 行得到了panic: runtime error: invalid memory address or nil pointer dereference

如果Repeater的所有成员都是函数,我该如何正确定义它?

【问题讨论】:

    标签: go


    【解决方案1】:

    当您定义变量r 时,它被初始化为零值,对于接口而言,为零。因此,当您调用SetPacketFunc 时,该函数的接收者为 nil,从而为您提供该错误。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2015-02-24
      • 2016-11-15
      相关资源
      最近更新 更多