任何人都可以解释这个使用方法表达式的程序

时间:2018-02-20 11:01:37

标签: go

我正在阅读一些教程,但是我无法理解表达式是什么。任何人都可以向我解释这个代码以及为什么/何时应该使用它?

 // Method call with "method expression" syntax
 func main() {
    dog := Dog{}
    b := (*Dog).Bark // method expression 
    b(&dog, 5)
 }
 type Dog struct {}

 // Methods have a receiver, and can also have a pointer
 func (d *Dog) Bark(n int) {
   for i := 0; i < n; i++ {
      fmt.Println("Bark");
   }
 }

1 个答案:

答案 0 :(得分:7)

method expression是一个可以像常规函数一样调用的函数,除了你还传递对象作为第一个参数。这是因为它需要知道要使用哪个对象。

通常,您只需使用以下内容:

d := &Dog{}
d.Bark(5)

但是使用方法表达式,你可以&#34;保存&#34;该功能,允许您将其传递给其他东西。例如,您可以选择使用(*Dog).Bark(*Dog).Sit作为操作,并从帮助程序中调用它。例如:

func main() {
    var b func(*Dog, int)
    if (shouldBark) {
        b = (*Dog).Bark
    } else {
        b = (*Dog).Sit
    }
    d := Dog{}
    DoAction(b, &d, 3)
}

func DoAction(f func(*Dog, int), d *Dog, n int) {
    f(d, n)
}

特定语法(*Dog).Bark表示您正在为具有指针接收器的方法派生函数。

老实说,这些并不经常使用。我建议你先掌握一下这门语言(比如:拿整个Go tour),然后在以后探索较少使用的功能。