Структура из той же родительской папки, что и основная, не видна

У меня есть небольшой демонстрационный проект в Гогланде со структурой:

awsomeProject
    ->src
        ->awsomeProject
            ->configuration.go
            ->main.go

Файл конфигурации имеет простую структуру только для демонстрации:
configuration.go:

package main

type Config struct {
    Data int
}

Основной файл просто использует структуру конфигурации:
main.go

package main

import "fmt"

func main(){
    var cfg Config
    cfg.Data = 1
    fmt.Println("lalala")
}

Ошибка, которая у меня есть:

/usr/local/go/bin/go run /Users/lapetre/Work/awsomeProject/src/awsomeProject/main.go аргументы командной строки src/awsomeProject/main.go:6: undefined: процесс настройки завершен с кодом выхода 2

Любая идея, почему Config не виден в основном?
Спасибо


person Lucian    schedule 21.07.2017    source источник


Ответы (3)


Когда вы создаете повторно используемые фрагменты кода, вы будете разрабатывать пакет как разделяемую библиотеку. Но когда вы разрабатываете исполняемые программы, вы будете использовать пакет «main» для создания пакета в качестве исполняемой программы. Пакет «main» сообщает компилятору Go, что пакет должен компилироваться как исполняемая программа, а не как разделяемая библиотека. Основная функция в пакете «main» будет точкой входа нашей исполняемой программы.

Вот почему вы должны использовать следующую структуру:

awsomeProject
    ->src
        ->awsomeProject
            ->configuration.go
        ->main.go

с main.go

package main

import "fmt"

func main(){
    var cfg awsomeProject.Config
    cfg.Data = 1
    fmt.Println("lalala")
}

и configuration.go

package awsomeProject

type Config struct {
    Data int
}

Больше подробностей:

person bayrinat    schedule 21.07.2017
comment
src/main.go:8: undefined: awsomeProject в awsomeProject.Config - person Lucian; 21.07.2017
comment
Это часть ответа, насколько я понимаю, важная часть - иметь проект в папке $ GOPATH, на мой взгляд, это немного глупо, вы не можете создать его где-нибудь на диске, а также вам нужно добавить его зависимость от пакета в основном, например: import ‹$GOATH›/awsomeProject/src/awsomeProject - person Lucian; 21.07.2017
comment
По соглашению все имена пакетов должны быть строчными. Я никогда не видел имени пакета в смешанном регистре до такой степени, что мне пришлось бы проверять, действительно ли оно вообще. - person Adrian; 21.07.2017
comment
@ Адриан согласен. Я только что использовал исходный синтаксис. - person bayrinat; 21.07.2017

Как ты звонишь, беги? Если вы называете это как

go run main.go

тогда это проблема.

Go run запускает только те файлы, которые вы указали. Поэтому вам нужно сказать ему также запускать configuration.go, или, если у вас есть несколько файлов go для запуска, вы можете использовать

go run *.go

как предложил eXMoor.

Однако у «go run *.go» есть некоторые ограничения/недостатки, поэтому лучшей альтернативой является использование go build вместо go run.

go build

Соберу все. Затем, чтобы запустить исполняемый файл:

./awesomeProject

Чтобы объединить все это в одну команду, которая скомпилирует и запустит любое приложение, над которым вы работаете, вы можете использовать:

go build && ./${PWD##*/}

у меня есть псевдоним

gorunapp

просто чтобы было легче.

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

person WaltPurvis    schedule 21.07.2017

Попробуйте запустить приложение с помощью команды:

go run *.go
person eXMooR    schedule 21.07.2017