аргументы командной строки: обработка «неопределенного» сообщения об ошибке - PullRequest
0 голосов
/ 27 января 2019

Вот как организованы исходные файлы

✘-1 ~/Go/src/github.com/krmahadevan/packages 
18:24 $ tree .
.
├── sample_main.go
└── sample_one.go

0 directories, 2 files

Вот как выглядит исходный код:

sample_one.go

package main

var data map[string]string

func init() {
    data = make(map[string]string, 0)
}

sample_one.go

package main

import "fmt"

func main() {
    data["foo"] = "bar"
    fmt.Println(data)
}

Теперь, когда я пытаюсь запустить sample_main.go , я получаю сообщение о том, что data не определено.

18:24 $ go run sample_main.go 
# command-line-arguments
./sample_main.go:6:2: undefined: data
./sample_main.go:7:14: undefined: data
✘-2 ~/Go/src/github.com/krmahadevan/packages

Но когда я собираю код в двоичный файл и затем выполняю его, он работает нормально.

✔ ~/Go/src/github.com/krmahadevan/packages 
18:27 $ go build
✔ ~/Go/src/github.com/krmahadevan/packages 
18:28 $ ./packages 
map[foo:bar]
✔ ~/Go/src/github.com/krmahadevan/packages

Я хотел бы понять, почему это поведение?

Окружающая среда:

18:31 $ go version
go version go1.11.4 darwin/amd64

Ближе всего я нашел этот пост: Голанг: аргументы командной строки undefined: переменная

Но в этом посте говорится о переменных области действия, которые определены в main.

Но моя постановка проблемы включает переменные, определенные в другом файле go и доступ к которым осуществляется методом main.

1 Ответ

0 голосов
/ 27 января 2019

Чтобы понять почему, прочитайте документацию команды go:

Команда go

Скомпилируйте и запустите программу Go

Использование:

go run [build flags] [-exec xprog] package [arguments...]

Запустить компиляцию и запустить указанный основной пакет Go.Обычно пакет указывается в виде списка исходных файлов .go, но это также может быть путь импорта, путь файловой системы или шаблон, соответствующий одному известному пакету, как в «go run».или 'go run my / cmd'.

Компиляция пакетов и зависимостей

Использование:

go build [-o output] [-i] [build flags] [packages]

Сборка компилирует пакеты, названные при импортепути, вместе с их зависимостями, но это не устанавливает результаты.

Если аргументы для сборки являются списком файлов .go, сборка обрабатывает их как список исходных файлов, указывающих один пакет.

Подробнее об указании пакетов см. В разделе «Перейти к справочным пакетам».Чтобы узнать больше о том, где установлены пакеты и двоичные файлы, запустите 'go help gopath'.


go run: Обычно пакет указывается в виде списка исходных файлов .go.

Для вашего go run примера перечислите файлы:

go run sample_main.go sample_one.go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...