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"
, независимо от того, с каким целым числом она была вызвана.