Невозможно импортировать после объявлений

Пытаюсь импортировать некоторые модули после объявлений в 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?

Я считаю, что это выбор создателей, поэтому код будет более читабельным.

Gabriel M 13.11.2018 11:49
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
1
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обычно у вас есть два способа импортировать пакеты в 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

«Обычно у вас есть два пути ..» обычно? Кроме того, когда?

Flimzy 13.11.2018 12:23

За исключением первого примера, приведенного OP, где у него уродливое сочетание того и другого ... Но даже если это уродливо, оно компилируется.

Guillaume Barré 13.11.2018 12:29

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 знает, что операторов импорта больше не будет. Затем он видит ваш ошибочный оператор импорта, видит, что это не декларация, и правильно генерирует ошибку, которую вы наблюдаете.

Другие вопросы по теме