Чтобы правильно использовать пакет, как организовать каталог, имя файла, unit test файл?

Дерево исходных файлов выглядит следующим образом:

/src
  /pkg
    /foo
      foo.go
      foo_test.go

Внутри foo.go:

package foo

func bar(n int) {
    ...
}

внутри foo_test.go:

package foo

func testBar(t *testing.T) {
    bar(10)
    ...
}

Мои вопросы:

  • Связано ли имя пакета с именем каталога, именем исходного файла?
  • Если для пакета есть только один исходный файл, нужно ли его поместить в каталог?
  • Должен ли я помещать foo.go и foo_test.go в тот же пакет?
  • В foo_test.go, так как он в том же пакете, что и foo.go, я не импортировал foo. Но когда я компилирую foo_test.go с 6g, он говорит, что bar() - undefined. Что мне делать?

Ответ 1

1 - Спецификация языка говорит следующее:

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

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

2 - Очевидно, файл должен находиться в некотором каталоге. Я предполагаю, что вы имеете в виду "должен ли я помещать его в подкаталог src?"? Мне кажется, на основе приведенной цитаты, что вы могли бы иметь все ваши файлы в src напрямую, если хотите.

3 - Да.

4 - Используйте go test