Каковы соглашения для имен файлов в Go?

115

Я смог найти соглашения для именования пакетов в Go: без подчеркивания между словами, все в нижнем регистре.

Применяется ли это соглашение и к именам файлов?

Вы также помещаете одну структуру в один файл, как если бы вы это делали для класса java, а затем называете файл после структуры?

В настоящее время, если у меня есть структура WebServer, я помещаю ее в файл web_server.go.

Дэвид
источник
3
AFAIK нет соглашения, но суффиксы _ могут иметь особую семантику в будущем, поэтому я рекомендую избегать их.
fuz 06

Ответы:

128

Есть несколько рекомендаций, которым нужно следовать.

  1. Имена файлов, начинающиеся с "." или "_" игнорируются инструментом go
  2. Файлы с суффиксом _test.goтолько компилируются и запускаются go testинструментом.
  3. Файлы с суффиксами, специфичными для ОС и архитектуры, автоматически подчиняются тем же ограничениям, например, name_linux.goбудут построены только на Linux, name_amd64.goбудут построены только на amd64. Это то же самое, что и //+build amd64строка вверху файла.

Дополнительную информацию см. В документации по go buildинструменту: https://golang.org/pkg/go/build/

JimB
источник
3
Где это задокументировано? Спасибо!
Abhijeet Rastogi
2
@AbhijeetRastogi: golang.org/pkg/go/build и golang.org/cmd/go
JimB
3
Что мне делать, если я хочу построить для unixи others. Например, я могу сделать два файла file_windows.goи file_others.go. Работает нормально. Но для этого file_unix.goи file_others.goне работает. Я не хочу создавать восемь файлов darwin freebsg linux openbsd netbsd dragonfly solaris android.
Иван Черный
3
@Fire: имена файлов обычно пишутся в нижнем регистре, как для согласованности, так и для систем с файловыми системами без учета регистра.
JimB
1
Для всех, у кого такой же вопрос, как у @IvanBlack, это можно сделать с помощью тегов сборки. См. Здесь хороший обзор того, как это сделать: dave.cheney.net/2013/10/12/…
Ян Густафсон
31

В дополнение к ответу, предоставленному JimB , обычные имена файлов должны быть строчными, короткими и без какого-либо подчеркивания или пробела. Как правило, имена файлов соответствуют тому же соглашению, что и имена пакетов. См. Раздел « Имена пакетов » в Effective Go .

См. Хороший пример в пакете strconv .

Замикол
источник
4
как бы вы назвали длинные файлы? mycommandsub1command.goили my_command_sub1command.go, а как насчетmycommandVO
user2727195
10
Я бы предложил использовать подчеркивание для длинных имен. Видел это в некоторых хороших проектах.
Avi
17

Go довольно либерален с точки зрения того, как вы организуете свой код в пакете, обычно это то, что улучшает читаемость и понимание вашего кода. Лучший способ узнать, как это делается, - изучить мастеров, то есть просмотреть стандартную библиотеку:

http://golang.org/src/pkg/

Однако есть два правила, которые я могу придумать. При указании кода, который должен быть скомпилирован для разных платформ, вы используете имя платформы как суффикс:

mypkg_linux.go         // only builds on linux systems
mypkg_windows_amd64.go // only builds on windows 64bit platforms

Также, если у вас есть файл с именем server.go, тесты для этого файла будут в server_test.go.

Мэтт Харрисон
источник
3
В предоставленной вами ссылке я нашел варианты использования с подчеркиванием: golang.org/src/pkg/compress/bzip2/move_to_front.go , golang.org/src/pkg/compress/flate/huffman_bit_writer.go , golang.org/ src / pkg / compress / flate / reverse_bits.go .
Дэвид
1
Я предполагаю , что они не будут использовать _front, _writerили _bitsкак существенные суффиксы в будущем , тогда!
Мэтт Харрисон
Мне нравится Go, но этот goинструмент очень ограничивает структуру пакетов (это одна из моих любимых вещей в языке). Он поддерживает некоторые очень конкретные соглашения (один пакет на папку [по крайней мере с одним исключением], пакет папки имеет то же имя, что и папка [по крайней мере с одним исключением], полный путь импорта пакета совпадает с относительным путем из $GOPATH, некоторые файлы обрабатываются по-разному в зависимости от формата имени и т. д.)
weberc2
1
@ weberc2 Ограничения аналогичны Latex. Во-первых, я хотел контролировать свой макет и другие нерелевантные детали, пока не понял, что все, что нужно написать, - это хороший контент. Точно так же Go позволяет нам писать хороший код и обрабатывать другие детали за нас.
Дэвид
@david Я согласен. Оглядываясь назад, мне было неясно: я отвечал на заявление ответчика Go is quite liberal in terms of how you organise your code within a package. Go не является либеральным, это довольно ограничительно. Но это хорошо.
weberc2 07
8

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

 cd $GOROOT/src/pkg/math/
 ls sqrt*s
sqrt_386.s  sqrt_amd64p32.s  sqrt_amd64.s  sqrt_arm.s

sqrt_386.sбудет читаться компилятором только на 32-битных процессорах, sqrt_amd64.sна amd64 и т. д.

Это может быть любое из допустимых значений GOOSи / или GOARCH( см .

file_windows_amd64.go будет компилироваться только на win64.

OneOfOne
источник