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

Thi*_*ker 1 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");
   }
 }
Run Code Online (Sandbox Code Playgroud)

Mar*_*arc 7

方法表达是一种可被称为像一个普通的功能,不同之处在于还通过作为第一个参数作用于目标函数.这是因为它需要知道要使用哪个对象.

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

d := &Dog{}
d.Bark(5)
Run Code Online (Sandbox Code Playgroud)

但是使用方法表达式,您可以"保存"该函数,允许您将其传递给其他东西.例如,您可以选择使用(*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)
}
Run Code Online (Sandbox Code Playgroud)

具体语法(*Dog).Bark意味着您正在为具有指针接收器的方法派生函数.

老实说,这些并不经常使用.我建议你先掌握一下语言(例如:参加整个围棋之旅),然后再考虑较少使用的功能.