Я собирался кодировать в golang net / http / server.go и нашел следующий код по адресу https://github.com/golang/go/blob/96745b980cfde139e8611772e2bc0c59a8e6cdf7/src/net/http/server.go#L2208

// DefaultServeMux is the default ServeMux used by Serve.
var DefaultServeMux = &defaultServeMux

var defaultServeMux ServeMux

Здесь мы видим, что указатель defaultServerMux назначается до того, как он будет объявлен в следующей строке. Я не пробовал создавать его сам, но это из коммита релиза. Как это здесь работает?

go
-2
Tarun Bansal 15 Апр 2020 в 18:32

1 ответ

Лучший ответ

Спецификация языка объясняет инициализацию переменных следующим образом:

... переменная уровня пакета считается готовой к инициализации, если она еще не инициализирована и либо не имеет выражения инициализации, либо ее выражение инициализации не зависит от неинициализированных переменных. Инициализация продолжается путем многократной инициализации следующей переменной уровня пакета, которая является самой ранней в порядке объявления и готова к инициализации, до тех пор, пока не останется переменных, готовых к инициализации.

https://golang.org/ref/spec#Package_initialization

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

3
Burak Serdar 15 Апр 2020 в 15:36