【问题标题】:golang function alias on method receiver方法接收器上的golang函数别名
【发布时间】:2016-01-08 16:10:28
【问题描述】:

我可以为常用方法创建方法别名:

func method1() {
    fmt.Println("method1")
}

var Method1 = method1

但不能对方法接收者做同样的事情:

type Person struct {
    Name string
}

func (p *Person) methodReciver() {
    fmt.Println("method reciver")
}

var MethodReciver = methodReciver

在这种情况下,我在var MethodReciver = methodReciver 线上遇到了错误:

undefined: methodReciver

完整代码:

package main

import (
    "fmt"
)

type Person struct {
    Name string
}

func method1() {
    fmt.Println("method1")
}

var Method1 = method1

func (p *Person) methodReceiver() {
    fmt.Println("method receiver")
}

var MethodReceiver = methodReceiver

func main() {
    method1()
    Method1()
    p := Person{"Nick"}
    p.methodReceiver()
    p.MethodReceiver()
}

Playground

是否可以为methodReceiver 创建方法别名?

【问题讨论】:

    标签: go alias


    【解决方案1】:

    基本上你有两个选择:

    1。使用Method Expression

    它的形式为ReceiverType.MethodName,它产生一个函数类型的值:

    var MethodReceiver = (*Person).methodReceiver
    

    MethodReceiver 只保存函数引用,但不是接收器,因此如果要调用它,还必须将接收器(*Person 类型)作为其拳头传递给它论据:

    var p = &Person{"Alice"}
    MethodReceiver(p)  // Receiver is explicit: p
    

    2。使用Method Value

    具有x.MethodName 的形式,其中表达式x 具有静态类型T

    var p = &Person{"Bob"}
    var MethodReceiver2 = p.methodReceiver
    

    一个方法值也存储了receiver,所以当你调用它时,你不必传递一个receiver给它:

    MethodReceiver2()  // Receiver is implicit: p
    

    完整示例

    试试Go Playground

    type Person struct {
        Name string
    }
    
    func (p *Person) printName() {
        fmt.Println(p.Name)
    }
    
    var PrintName1 = (*Person).printName
    
    func main() {
        var p1 *Person = &Person{"Bob"}
        PrintName1(p1) // Have to specify receiver explicitly: p1
    
        p2 := &Person{"Alice"}
        var PrintName2 = p2.printName // Method value, also stores p2
        PrintName2()                  // Implicit receiver: p2
    }
    

    输出:

    Bob
    Alice
    

    【讨论】:

      【解决方案2】:

      是的。您可以这样创建别名:

      var MethodReceiver = (*Person).methodReceiver
      

      当你调用它时,你必须提供一个指向 person 对象的指针作为第一个参数:

      MethodReceiver(&p)
      

      你可以see this in action on the Go Playground

      【讨论】:

        【解决方案3】:

        这叫method expressionvar MethodReceiver = (*Person).methodReceiver

        Playground

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-30
          • 1970-01-01
          • 2017-11-08
          • 2016-02-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-20
          相关资源
          最近更新 更多