Apa konvensi untuk nama file di Go?

114

Saya bisa menemukan konvensi untuk menamai paket di Go: tidak ada garis bawah di antara kata-kata, semuanya huruf kecil.

Apakah konvensi ini juga berlaku untuk nama file?

Apakah Anda juga meletakkan satu struct dalam satu file seperti yang Anda lakukan untuk kelas java dan kemudian menamai file tersebut setelah struct?

Saat ini, jika saya memiliki struct WebServer, saya memasukkannya ke dalam file web_server.go.

David
sumber
3
AFAIK tidak ada konvensi tetapi _ sufiks mungkin memiliki semantik khusus di masa mendatang jadi saya sarankan untuk menghindarinya.
fuz

Jawaban:

126

Ada beberapa pedoman untuk diikuti.

  1. Nama file yang dimulai dengan "." atau "_" diabaikan oleh alat go
  2. File dengan akhiran _test.gohanya dikompilasi dan dijalankan oleh go testalat.
  3. File dengan sufiks khusus os dan arsitektur secara otomatis mengikuti batasan yang sama, misalnya name_linux.gohanya akan dibangun di linux, name_amd64.gohanya akan dibangun di atas amd64. Ini sama dengan memiliki //+build amd64garis di bagian atas file

Lihat dokumen go buildalat untuk mengetahui detail selengkapnya: https://golang.org/pkg/go/build/

JimB
sumber
3
Di mana ini didokumentasikan? Terima kasih!
Abhijeet Rastogi
2
@AbhijeetRastogi: golang.org/pkg/go/build dan golang.org/cmd/go
JimB
3
Apa yang harus saya lakukan jika saya ingin membangun untuk unixdan others. Misalnya saya bisa membuat dua file file_windows.godan file_others.go. Ini bekerja dengan baik. Tapi untuk file_unix.godan file_others.goitu tidak berhasil. Saya tidak ingin membuat delapan file darwin freebsg linux openbsd netbsd dragonfly solaris android.
Ivan Black
3
@Fire: nama file umumnya semua huruf kecil, baik untuk konsistensi dan untuk sistem dengan sistem file yang tidak peka huruf besar / kecil.
JimB
1
Untuk siapa pun yang memiliki pertanyaan yang sama dengan @IvanBlack, ini dapat diselesaikan menggunakan tag build. Lihat di sini untuk gambaran yang bagus tentang bagaimana melakukan itu: dave.cheney.net/2013/10/12/…
Ian Gustafson
30

Selain jawaban yang diberikan oleh JimB , nama file biasa adalah huruf kecil, pendek, dan tanpa garis bawah atau spasi apa pun. Umumnya, nama file mengikuti konvensi yang sama dengan nama paket. Lihat Nama Paket bagian Efektif Go .

Lihat paket strconv untuk contoh yang bagus.

Zamicol
sumber
3
apa nama file yang panjang? mycommandsub1command.goatau my_command_sub1command.go, dan bagaimana denganmycommandVO
pengguna2727195
9
Saya menyarankan garis bawah untuk nama yang panjang. Telah melihat ini di beberapa proyek bagus.
Avi
17

Go cukup liberal dalam hal bagaimana Anda mengatur kode Anda dalam sebuah paket, biasanya itu meningkatkan keterbacaan dan pemahaman kode Anda. Cara terbaik untuk mempelajari bagaimana hal ini dilakukan adalah dengan mempelajari para master, yaitu memiliki penelusuran melalui perpustakaan standar:

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

Ada 2 aturan yang bisa saya pikirkan. Saat menentukan kode yang akan dikompilasi untuk platform yang berbeda, Anda menggunakan nama platform sebagai sufiks:

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

Juga jika Anda memiliki file yang dipanggil server.go, pengujian untuk file itu akan masuk server_test.go.

Matt Harrison
sumber
1
Saya kira mereka tidak akan menggunakan _front, _writeratau _bitssebagai sufiks yang signifikan di masa mendatang!
Matt Harrison
Saya suka Go, tetapi goalatnya sangat membatasi tentang struktur paket (ini salah satu hal favorit saya tentang bahasa). Ini mendukung beberapa konvensi yang sangat spesifik (satu paket per folder [dengan setidaknya satu pengecualian], paket folder memiliki nama yang sama dengan folder [dengan setidaknya satu pengecualian], jalur impor paket lengkap cocok dengan jalur relatif dari $GOPATH, beberapa file diperlakukan berbeda tergantung pada format nama mereka, dll)
weberc2
1
@ weberc2 Pembatasan ini dianalogikan dengan Latex. Pertama, saya ingin mengontrol tata letak saya dan detail lain yang tidak relevan, sampai saya menyadari bahwa yang perlu ditulis adalah konten yang bagus. Demikian pula, Go memungkinkan kita menulis kode yang baik dan menangani detail lain untuk kita.
david
@david Saya setuju. Dalam retrospeksi saya tidak jelas: Saya menanggapi pernyataan penjawab Go is quite liberal in terms of how you organise your code within a package. Go tidak liberal, itu cukup membatasi. Tapi itu bagus.
weberc2
8

Biasanya garis bawah dalam nama file digunakan untuk menetapkan kode platform / arch-only, misalnya:

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

sqrt_386.shanya akan dibaca oleh kompiler pada prosesor 32bit, sqrt_amd64.spada amd64, dll.

Ini bisa berupa nilai yang valid dari GOOSdan / atau GOARCH( ref .

file_windows_amd64.go hanya akan dikompilasi di win64.

OneOfOne
sumber