我可以为常用方法创建方法别名:
1 2 3 4 5 | func method1() { fmt.Println("method1") } var Method1 = method1 |
但是不能对方法接收者做同样的事情:
1 2 3 4 5 6 7 8 9 | type Person struct { Name string } func (p *Person) methodReciver() { fmt.Println("method reciver") } var MethodReciver = methodReciver |
在这种情况下,我在第
1 | undefined: methodReciver |
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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() } |
操场
是否可以为
基本上,您有2个选择:
1.使用方法表达式
1 | var MethodReceiver = (*Person).methodReceiver |
1 2 | var p = &Person{"Alice"} MethodReceiver(p) // Receiver is explicit: p |
2.使用方法值
形式为
1 2 | var p = &Person{"Bob"} var MethodReceiver2 = p.methodReceiver |
方法值也存储接收器,因此,在调用它时,不必将接收器传递给它:
1 | MethodReceiver2() // Receiver is implicit: p |
完整的例子
在Go Playground上尝试一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 } |
输出:
1 2 | Bob Alice |
是。 您可以这样命名:
1 | var MethodReceiver = (*Person).methodReceiver |
调用它时,必须提供一个指向人员对象的指针作为第一个参数:
1 | MethodReceiver(&p) |
您可以在Go Playground上看到这一点。
这称为方法表达式
操场