Go - это язык процедурного программирования со множеством функциональных программ элементов.
Функции являются первоклассными типами в Go, вы можете создавать переменные типа функции,и вы можете назначить значения функций этим переменным, и вы можете вызвать их (значение функции сохранено в них).
Таким образом, вы можете просто сделать:
var myprint = fmt.Println
myprint("Hello, playground")
myprint(1, 3.14, "\n", time.Now())
Вывод вышеупомянутого (попробуйте на Go Playground ):
Hello, playground
1 3.14
2009-11-10 23:00:00 +0000 UTC m=+0.000000001
Преимущество указанной выше переменной myprint
заключается в том, что она будет иметь такую же сигнатуру, что и fmt.Println()
Это:
func Println(a ...interface{}) (n int, err error)
Да, мы также можем создать функцию-оболочку, например:
func myprint(a ...interface{}) (n int, err error) {
return fmt.Println(a...)
}
И она будет работать так же, как и вызов fmt.Println()
, но использование переменнойменее многословно, и имеет то преимущество, что вы можете изменить значение функции во время выполнения , что очень удобно при написании тестов (например, см. Тестирование os.Exit сценариев в Go с информацией покрытия)(coveralls.io/Goveralls)).
Mпо теме:
Дейв Чейни: не бойтесь функций первого класса
golangbot.com: Функции первого класса
Еще одна возможность заключается в использовании «точечного импорта», но я советую против этого:
import (
. "fmt"
)
func main() {
Println("Hello, playground")
}
Когда вы используете «точечный импорт», все экспортированные идентификаторы импортированного пакета становятся доступными без использования квалифицированных идентификаторов .Цитирование из Spec: Импорт объявлений:
Если вместо имени появляется явный период (.
), все экспортированные идентификаторы пакета, объявленные в пакете этого пакетаблок будет объявлен в блоке файла импортирующего исходного файла и должен быть доступен без квалификатора.