Имеет ли смысл иметь два пакета в одном каталоге?
У меня есть проект, который предоставляет библиотеку (экспортирует некоторые функции), а также должен предоставить интерфейс командной строки (должен быть исполняемый файл).
Пример структуры каталогов:
whatever.io/
myproject/
main.go
myproject.go
Для запуска компилятора go нужны пакеты main и func main. Моя библиотека нуждается в пакете myproject, куда я помещаю вещи. Вот что говорит инструмент go при создании другого проекта, который пытается импортировать myproject:
main.go:5:2: found packages myproject (myproject.go) and main (main.go) in $GOPATH/src/whatever.io/myproject
Поэтому я считаю, что нет способа сделать это.
Должен ли я переместить библиотеку или интерфейс командной строки в другой пакет?
Ответы
Ответ 1
Просто переместите пакеты внутри новой папки в том же каталоге main.go.
Не забудьте импортировать новый пакет из ссылки $GOPATH.
Пример:
[email protected]:~/p/go/test/so-multipack$ ls -R
.:
a main.go
./a:
a.go
[email protected]:~/p/go/test/so-multipack$ cat main.go
package main
import (
"../so-multipack/a"
)
func main(){
a.Hello()
}
[email protected]:~/p/go/test/so-multipack$ cat a/a.go
package a
import (
"fmt"
)
func Hello(){
fmt.Println("hello from a")
}
[email protected]:~/p/go/test/so-multipack$ go run main.go
hello from a
[email protected]:~/p/go/test/so-multipack$ go build
[email protected]:~/p/go/test/so-multipack$ ls
a main.go so-multipack
[email protected]:~/p/go/test/so-multipack$
Полезная ссылка:
go build vs go build file.go
Ответ 2
У вас не может быть двух пакетов в каталоге, поэтому ошибка. Поэтому решение, как @Larry Battle, переместило ваш myproject.go
в новый каталог.
Из Как написать код перехода
Код Go должен храниться внутри рабочего пространства. Рабочая область - это каталог иерархия с тремя каталогами в корне:
src содержит исходные файлы Go, организованные в пакеты (один пакет для каталога),
pkg содержит объекты пакета и
bin содержит исполняемые команды.
Ответ 3
В большинстве случаев нет. Тем не менее, есть исключение для юнит-тестов.
Рабочий пример:
Вот 2 разных пакета (mypackage
и mypackage_test
) в 1 каталоге (mypackage
). Компилятор не будет жаловаться на это.
папка mypackage:
mypackage/
foo.go
foo_test.go
MyPackage/foo.go:
package mypackage
func Add(a int, b int) int {
return a + b
}
MyPackage/foo_test.go:
package mypackage_test
// Unit tests...
Правила:
-
2 пакета должны иметь следующие имена:
- NameOfDirectory.
- NameOfDirectory +
_test
.
-
Имена файлов в пакете _test
должны заканчиваться на _test.go
Если вы получаете сбивающую с толку ошибку компилятора в строке found packages "foo" and "bar"
, вы, вероятно, нарушили одно или несколько из этих правил.