Пытаюсь импортировать некоторые модули после объявлений в Go.
Например, я попытался импортировать время после объявления переменной, но это не сработало, может кто-нибудь сказать мне, почему это происходит в Go?
Это работает:
package main
import (
"fmt"
)
import "time";
var test = "testing"
func main() {
currtime := time.Now()
fmt.Println(test)
fmt.Println(currtime)//Output: 16:44:53
}
Но этого не происходит:
package main
import (
"fmt"
)
var test = "testing"
import "time"
func main() {
currtime := time.Now()
fmt.Println(test)
fmt.Println(currtime)//Output: 16:44:53
}
Ошибка - «оператор без объявления вне тела функции». Почему это происходит в Go?

Обычно у вас есть два способа импортировать пакеты в Go:
import "fmt"
import "time"
Или
import (
"fmt"
"time"
)
Хитрость в том, что у вас не может быть смеси import и чего-то еще, как во втором примере.
package main
import (
"fmt"
)
var test = "testing" //<-- This does not comply with the definition of a Go file
import "time"
func main() {
currtime := time.Now()
fmt.Println(test)
fmt.Println(currtime)//Output: 16:44:53
}
Here you can find a well done documentation of the Anatomy of .go file.
Structure of every .go file is the same.
First is package clause optionally preceded with comments usually describing the purpose of the package.
Then zero or more import declarations.
3rd section contains zero or more top-level declarations
«Обычно у вас есть два пути ..» обычно? Кроме того, когда?
За исключением первого примера, приведенного OP, где у него уродливое сочетание того и другого ... Но даже если это уродливо, оно компилируется.
why does that happen in go lang ?
Потому что это запрещено спецификацией языка. Довольно просто, или?
The error is "non-declaration statement outside function body". Why does that happen in Go?
Потому что именно так работает Go. От спецификация:
Each source file consists of a package clause defining the package to which it belongs, followed by a possibly empty set of import declarations that declare packages whose contents it wishes to use, followed by a possibly empty set of declarations of functions, types, variables, and constants.
Это означает, что допустимое место Только для операторов импорта находится между предложением package и объявлениями функций, типов, переменных и констант.
В вашем случае у вас есть объявление переменной, поэтому компилятор Go знает, что операторов импорта больше не будет. Затем он видит ваш ошибочный оператор импорта, видит, что это не декларация, и правильно генерирует ошибку, которую вы наблюдаете.
Я считаю, что это выбор создателей, поэтому код будет более читабельным.