Имеет ли смысл иметь два пакета в одном каталоге?

У меня есть проект, который предоставляет библиотеку (экспортирует некоторые функции), а также должен предоставить интерфейс командной строки (должен быть исполняемый файл).

Пример структуры каталогов:

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...

Правила:

  1. 2 пакета должны иметь следующие имена:

    • NameOfDirectory.
    • NameOfDirectory + _test.
  2. Имена файлов в пакете _test должны заканчиваться на _test.go

Если вы получаете сбивающую с толку ошибку компилятора в строке found packages "foo" and "bar", вы, вероятно, нарушили одно или несколько из этих правил.