是可选的接收器吗?

时间:2018-03-17 15:33:08

标签: go

是否可以为函数定义可选的接收器?

func (r ReceiverType) doSth(arg ArgType) (ReturnType) {
    if r == nil {
        return doSthWithoutReceiver()
    }

    return r.doSthWithReceiver()
}

这样我可以按如下方式调用函数:

var sth ReceiverType
resWithoutRecv := doSth()
resWithRecv := sth.doSth()

不需要基本上写两次相同的功能,一次使用和没有接收器一次?既然我没有找到任何东西,我认为这是不好的做法吗?

1 个答案:

答案 0 :(得分:6)

不可能使receiver参数可选,但你可以声明一个方法和一个具有相同名称的函数:

func (r ReceiverType) doSth(arg ArgType) (ReturnType) {
    return r.doSthWithReceiver()
}

func doSth(arg ArgType) (ReturnType) {
    return doSthWithoutReceiver()
}

并按照问题中的说明打电话给他们:

var sth ReceiverType
resWithoutRecv := doSth()
resWithRecv := sth.doSth()

您还可以检查无接收器:

func (r *ReceiverType) doSth(arg ArgType) (ReturnType) {
    if r == nil {
        return doSthWithoutReceiver()
    }
    return r.doSthWithReceiver()
}

并将其称为:

var sth *ReceiverType
resWithoutRecv := sth.doSth()  // sth == nil