Що таке умовні назви файлів у програмі Go?


114

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

Чи застосовується ця конвенція і до назви файлів?

Чи також ви кладете одну структуру в один файл, як якщо б ви зробили для класу java, а потім називаєте цей файл після структури?

Наразі, якщо у мене є структура WebServer, я поміщую її у файл web_server.go.


3
AFAIK немає умовності, але _ суфікси можуть мати особливу семантику в майбутньому, тому я рекомендую їх уникати.
fuz

Відповіді:


126

Дотримуйтесь декількох вказівок.

  1. Імена файлів, що починаються з "." або "_" ігнорується інструментом "go"
  2. Файли з суфіксом _test.goзбираються та запускаються лише go testінструментом.
  3. Файли з os та суфіксами архітектури автоматично дотримуються тих самих обмежень, наприклад 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/…
Ian Gustafson

30

Окрім відповіді, яку надає JimB , імена звичайних файлів мають малі регістри , короткі та без будь-якого підкреслення чи пробілу. Як правило, імена файлів відповідають тій самій умові, що і назви пакетів. Див. Розділ Імена пакета в розділі « Ефективний перехід» .

Дивіться пакет strconv для хорошого прикладу.


3
що ти дав назві довгим файлам? mycommandsub1command.goабо my_command_sub1command.go, а щоmycommandVO
користувач2727195

9
Я б запропонував підкреслити довгі назви. Бачили це в деяких хороших проектах.
Аві

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 / стиснути / flate / reverse_bits.go .
Девід

1
Я думаю, що вони не використовуватимуть _front, _writerабо _bitsяк суттєві суфікси в майбутньому!
Метт Харрісон

Я люблю Go, але goінструмент дуже обмежує структуру пакунків (це одна з моїх улюблених речей щодо мови). Він надає перевагу дуже специфічним умовам (один пакет у папці [принаймні одним винятком]; пакет папки має те саме ім'я, що і папка [принаймні одним винятком]. Повний шлях імпорту пакета відповідає відносному шляху $GOPATH, деякі файли є по-різному, залежно від формату імені тощо)
weberc2

1
@ weberc2 Обмеження аналогічні латексу. По-перше, я хотів контролювати свій макет та інші невідповідні деталі, поки не зрозумів, що все, що потрібно писати, є хорошим змістом. Так само Go дозволяє нам писати хороший код та обробляти інші деталі для нас.
Девід

@david Я згоден. З ретроспективою мені було незрозуміло: я відповідав на заяву відповідача Go is quite liberal in terms of how you organise your code within a package. Іти не ліберально, це досить обмежувально. Але це гарна річ.
weberc2

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.