Два имени функции после ключевого слова func - что это? - PullRequest
0 голосов
/ 27 декабря 2018

Как понять последнюю функцию?Почему мы используем разные имена функций после объявления func?Как использовать эти функции?Использовать его, как показано в функции main, неправильно.

package main

import (
    "fmt"
)

func main() {
    fmt.Println(incrementer()) //error
}

func incrementer() func() int { //what is it?!
    i := 0
    return func() int {
        i++
        return i
    }
}

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Это просто означает, что функция возвращает функцию, которая не принимает параметров и возвращает целое число.Это то, о чем говорит часть вашей подписи

... func() int 

.

Ошибка, которую вы получаете, заключается в том, что вы не можете напечатать функцию fmt.Println.Чтобы показать это, вы можете увидеть, что вы получаете ту же ошибку при вызове,

func main() {
    fmt.Println(foo)
}

func foo() int {
  return 1
}

Возможно, было бы яснее увидеть, что происходит, если вы вызываете свою функцию следующим образом.

func main() {
    myIncrementer := incrementer()
    fmt.Println(myIncrementer()) // Prints 1
}

Где вы создаете инкремент, который является функцией, затем вызываете функцию, которая возвращает 1.

0 голосов
/ 27 декабря 2018

Проще говоря, поскольку incrementer() возвращает функцию, функция, которую она возвращает, также должна вызываться.Вы можете сделать это так:

functionFoo := incrementer()
fmt.Println(functionFoo())

Или это сокращенным способом:

fmt.Println(incrementer()())

Для достижения того же результата вы просто немедленно выполняете функцию, которую возвращает incrementer().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...