Каковы соглашения для имен файлов в 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/


3
Где это задокументировано? Спасибо!
Abhijeet Rastogi


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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.