я не понимаю код: result = quote123 (func (x int) string {return fmt.Sprintf ("% b", x)}) - PullRequest
0 голосов
/ 24 января 2019

я изучаю golang для кода, который передает функцию в качестве параметра для другой функции, я не знаю смысла кода, который я перечислил

для функции quote123, она принимает функцию в качестве параметра, как часть: func (x int) string {return fmt.Sprintf ("% b", x)} передается в функцию quote123, даже если работает, если эта часть возвращает строку, эта строка не должна быть параметром для функции quote123

// convert types take an int and return a string value.
type convert func(int) string

// value implements convert, returning x as string.
func value(x int) string {
    return fmt.Sprintf("%v", x)
}

// quote123 passes 123 to convert func and returns quoted string.
func quote123(fn convert) string {
    return fmt.Sprintf("%q", fn(123))
}

func main() {
    var result string

    result = value(123)
    fmt.Println(result)
    // Output: 123

    result = quote123(value)
    fmt.Println(result)
    // Output: "123"

    result = quote123(func(x int) string { return fmt.Sprintf("%b", x) })
    fmt.Println(result)
    // Output: "1111011"

    foo := func(x int) string { return "foo" }
    result = quote123(foo)
    fmt.Println(result)
    // Output: "foo"

    _ = convert(foo) // confirm foo satisfies convert at runtime
    // fails due to argument type
    // _ = convert(func(x float64) string { return "" })
}

1 Ответ

0 голосов
/ 25 января 2019

quote123 принимает любую функцию, которая принимает целочисленный аргумент и возвращает строку. Аргумент, передаваемый ему в этом коде, является функциональным литералом, также называемым вложением или анонимной функцией, с этой сигнатурой. Функциональный литерал состоит из двух частей:

func(x int) string

Это подпись функционального литерала. Это показывает, что он соответствует типу аргумента, принятого quote123, который является типом convert, именованным типом, определенным как type convert func(int) string

{ return fmt.Sprintf("%b", x) }

Это тело или реализация литерала функции. Этот код фактически запускается при вызове литерала функции. В этом случае оно принимает целое число x, форматирует его в двоичном формате (это то, что делает глагол форматирования %b) как строку и возвращает эту строку.

quote123 принимает эту функцию в качестве аргумента, вызывает ее с целым числом (в данном случае, целым числом 123), затем берет возвращаемую строку и форматирует ее с помощью глагола форматирования %q, который окружает данные строки в кавычках.

В результате получается 123, форматируется как двоичный файл (1111011), возвращается как строка (1111011), затем снова форматируется с окружающими кавычками ("1111011"), которые затем в конечном итоге выводятся на печать. к консоли.

Принятие литерала функции, подобного этому, позволяет настроить поведение при вызове функции. quote123 всегда будет возвращать строку в кавычках, но то, что в ней может измениться. Например, если бы я вместо этого дал ему следующий литерал:

func(x int) string { return fmt.Sprintf("%06d", x) }

Я бы вернул строку "000123", потому что глагол форматирования %06d говорит, что он должен быть напечатан как целое число шириной 6 и дополнить его нулями вместо пробелов. Если бы я вместо этого использовал:

func(x int) string { return "hello world" }

Я бы всегда возвращал строку "hello world", независимо от того, с каким целым числом она была вызвана.

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