Quais são as convenções para nomes de arquivo em Go?

114

Eu poderia encontrar as convenções para nomear pacotes em Go: sem sublinhado entre as palavras, tudo em minúsculas.

Esta convenção também se aplica aos nomes dos arquivos?

Você também coloca uma estrutura em um arquivo como se fizesse para uma classe java e, em seguida, nomeia o arquivo após a estrutura?

Atualmente, se eu tenho um struct WebServer, coloco em um arquivo web_server.go.

david
fonte
3
AFAIK não há convenção, mas os sufixos _ podem ter uma semântica especial no futuro, então eu recomendo evitá-los.
fuz

Respostas:

126

Existem algumas orientações a seguir.

  1. Nomes de arquivos que começam com "." ou "_" são ignorados pela ferramenta go
  2. Arquivos com o sufixo _test.gosão compilados e executados apenas pela go testferramenta.
  3. Arquivos com sufixos específicos de sistema operacional e arquitetura seguem automaticamente essas mesmas restrições, por exemplo, name_linux.goserão construídos apenas no Linux, name_amd64.goserão construídos apenas em amd64. Isso é o mesmo que ter uma //+build amd64linha no topo do arquivo

Consulte os documentos da go buildferramenta para obter mais detalhes: https://golang.org/pkg/go/build/

JimB
fonte
3
Onde isso está documentado? Obrigado!
Abhijeet Rastogi
2
@AbhijeetRastogi: golang.org/pkg/go/build e golang.org/cmd/go
JimB
3
O que devo fazer se quiser construir para unixe others. Por exemplo, posso fazer dois arquivos file_windows.goe file_others.go. Funciona bem. Mas para file_unix.goe file_others.gonão funciona. Não quero criar oito arquivos darwin freebsg linux openbsd netbsd dragonfly solaris android.
Ivan Black
3
@Fire: os nomes dos arquivos geralmente são todos minúsculos no caso, tanto para consistência quanto para sistemas com sistemas de arquivos que não diferenciam maiúsculas de minúsculas.
JimB
1
Para qualquer pessoa com a mesma pergunta que @IvanBlack, isso pode ser feito usando tags de construção. Veja aqui uma boa visão geral de como fazer isso: dave.cheney.net/2013/10/12/…
Ian Gustafson
30

Além da resposta fornecida por JimB , os nomes de arquivo regulares são minúsculos, curtos e sem qualquer tipo de sublinhado ou espaço. Geralmente, os nomes dos arquivos seguem a mesma convenção dos nomes dos pacotes. Consulte a seção Nomes de pacotes do Effective Go .

Veja o pacote strconv para um bom exemplo.

Zamicol
fonte
3
como você deu um nome a arquivos longos? mycommandsub1command.goou my_command_sub1command.goe quantomycommandVO
user2727195
9
Eu sugeriria sublinhados para nomes longos. Já vi isso em alguns bons projetos.
Avi
17

Go é bastante liberal em termos de como você organiza seu código dentro de um pacote, geralmente é o que melhora a legibilidade e compreensão de seu código. A melhor maneira de aprender como isso é feito é estudar os mestres, ou seja, navegar pela biblioteca padrão:

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

Existem 2 regras nas quais posso pensar. Ao especificar o código a ser compilado para plataformas diferentes, você usa o nome da plataforma como um sufixo:

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

Além disso, se você tiver um arquivo chamado server.go, os testes para esse arquivo serão em server_test.go.

Matt Harrison
fonte
1
Eu acho que eles não usarão _front, _writerou _bitscomo sufixos significativos no futuro!
Matt Harrison
Eu amo Go, mas a goferramenta é muito restritiva quanto à estrutura de pacotes (é uma das minhas coisas favoritas sobre a linguagem). Favorece algumas convenções muito específicas (um pacote por pasta [com pelo menos uma exceção], o pacote da pasta compartilha o mesmo nome da pasta [com pelo menos uma exceção], o caminho completo de importação do pacote corresponde ao caminho relativo de $GOPATH, alguns arquivos são tratados de forma diferente dependendo do formato do nome, etc)
weberc2
1
@ weberc2 As restrições são análogas ao Latex. Primeiro, eu queria controlar meu layout e outros detalhes irrelevantes, até perceber que tudo o que precisa ser escrito é um bom conteúdo. Da mesma forma, Go nos permite escrever um bom código e lida com outros detalhes para nós.
David
@david eu concordo. Em retrospecto, não estava claro: estava respondendo à declaração do respondente Go is quite liberal in terms of how you organise your code within a package. Go não é liberal, é bastante restritivo. Mas isso é bom.
weberc2
8

Normalmente, o sublinhado em nomes de arquivo é usado para atribuir código de plataforma / apenas de arquitetura, por exemplo:

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

sqrt_386.ssó será lido pelo compilador em processadores de 32 bits, sqrt_amd64.sem amd64, etc.

Pode ser qualquer um dos valores válidos de GOOSe / ou GOARCH( ref .

file_windows_amd64.go será compilado apenas no win64.

OneOfOne
fonte