Các quy ước cho tên tệp trong Go là gì?


114

Tôi có thể tìm thấy các quy ước đặt tên gói trong Go: không có gạch dưới giữa các từ, mọi thứ đều viết thường.

Quy ước này có áp dụng cho cả tên tệp không?

Bạn cũng đặt một cấu trúc trong một tệp như thể bạn đã làm cho một lớp java và sau đó đặt tên tệp sau cấu trúc?

Hiện tại, nếu tôi có một WebServer cấu trúc, tôi đặt nó vào một tệp web_server.go.


3
AFAIK không có quy ước nhưng hậu tố _ có thể có ngữ nghĩa đặc biệt trong tương lai, vì vậy tôi khuyên bạn nên tránh chúng.
fuz

Câu trả lời:


126

Có một số nguyên tắc cần tuân theo.

  1. Tên tệp bắt đầu bằng "." hoặc "_" bị công cụ go bỏ qua
  2. Các tệp có hậu tố _test.gochỉ được biên dịch và chạy bởi go testcông cụ.
  3. Các tệp có hậu tố cụ thể của hệ điều hành và kiến ​​trúc sẽ tự động tuân theo các ràng buộc tương tự, ví dụ: name_linux.gosẽ chỉ xây dựng trên linux, name_amd64.gosẽ chỉ xây dựng trên amd64. Điều này cũng giống như việc có một //+build amd64dòng ở đầu tệp

Xem tài liệu về go buildcông cụ để biết thêm chi tiết: https://golang.org/pkg/go/build/


3
Tài liệu này ở đâu? Cảm ơn!
Abhijeet Rastogi


3
Tôi nên làm gì nếu tôi muốn xây dựng cho unixothers. Ví dụ: tôi có thể tạo hai tệp file_windows.gofile_others.go. Nó hoạt động tốt. Nhưng cho file_unix.gofile_others.gonó không hoạt động. Tôi không muốn tạo tám tệp darwin freebsg linux openbsd netbsd dragonfly solaris android.
Ivan Black

3
@Fire: tên tệp thường là tất cả chữ thường trong trường hợp, cả để nhất quán và cho các hệ thống có hệ thống tệp không phân biệt chữ hoa chữ thường.
JimB,

1
Đối với bất kỳ ai có cùng câu hỏi với @IvanBlack, điều này có thể được thực hiện bằng cách sử dụng thẻ xây dựng. Xem ở đây để biết tổng quan tốt đẹp về cách thực hiện điều đó: dave.cheney.net/2013/10/12/…
Ian Gustafson

30

Ngoài câu trả lời do JimB cung cấp , tên tệp thông thường là chữ thường, ngắn và không có bất kỳ loại gạch dưới hoặc khoảng trắng nào. Nói chung, tên tệp tuân theo quy ước giống như tên gói. Xem phần Tên gói của Cờ vây hiệu quả .

Xem gói strconv để biết ví dụ điển hình.


3
bạn đặt tên cho các tệp dài là gì? mycommandsub1command.gohoặc my_command_sub1command.go, và những gì vềmycommandVO
user2727195

9
Tôi sẽ đề xuất dấu gạch dưới cho những cái tên dài. Đã thấy điều này trong một số dự án tốt.
Avi

17

Go khá tự do về cách bạn tổ chức mã của mình trong một gói, thường thì đó là bất cứ thứ gì cải thiện khả năng đọc và hiểu mã của bạn. Cách tốt nhất để tìm hiểu cách thực hiện điều này là học thạc sĩ, tức là có một bản duyệt qua thư viện tiêu chuẩn:

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

Tuy nhiên, có 2 quy tắc tôi có thể nghĩ ra. Khi chỉ định mã sẽ được biên dịch cho các nền tảng khác nhau, bạn sử dụng tên nền tảng làm hậu tố:

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

Ngoài ra, nếu bạn có một tệp được gọi server.go, các bài kiểm tra cho tệp đó sẽ có trong đó server_test.go.


3
Trong liên kết bạn cung cấp, tôi đã tìm thấy các trường hợp sử dụng có gạch dưới: golang.org/src/pkg/compress/bzip2/move_to_front.go , golang.org/src/pkg/compress/flate/huffman_bit_writer.go , golang.org/ src / pkg /ression / flate / reverse_bits.go .
david

1
Tôi đoán họ sẽ không sử dụng _front, _writerhoặc _bitsnhư những hậu tố quan trọng trong tương lai!
Matt Harrison

Tôi yêu Go, nhưng gocông cụ này rất hạn chế về cấu trúc gói (đó là một trong những điều yêu thích của tôi về ngôn ngữ). Nó ủng hộ một số quy ước rất cụ thể (một gói cho mỗi thư mục [với ít nhất một ngoại lệ], gói của thư mục có cùng tên với thư mục [với ít nhất một ngoại lệ], đường dẫn nhập gói đầy đủ khớp với đường dẫn tương đối từ đó $GOPATH, một số tệp được đối xử khác nhau tùy thuộc vào định dạng tên của họ, v.v.)
weberc2

1
@ weberc2 Các hạn chế tương tự như Latex. Đầu tiên, tôi muốn kiểm soát bố cục của mình và các chi tiết không liên quan khác, cho đến khi tôi nhận ra rằng tất cả những gì cần viết là nội dung tốt. Tương tự, Go cho phép chúng tôi viết mã tốt và xử lý các chi tiết khác cho chúng tôi.
david

@david Tôi đồng ý. Khi nhìn lại, tôi không rõ: Tôi đang trả lời câu nói của người trả lời Go is quite liberal in terms of how you organise your code within a package. Cờ vây không phải là tự do, nó khá hạn chế. Nhưng đó là một điều tốt.
weberc2

8

Thông thường, dấu gạch dưới trong tên tệp được sử dụng để gán mã nền tảng / chỉ cung cấp, ví dụ:

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

sqrt_386.ssẽ chỉ được đọc bởi trình biên dịch trên bộ xử lý 32 bit, sqrt_amd64.strên amd64, v.v.

Nó có thể là bất kỳ giá trị hợp lệ nào của GOOS và / hoặc GOARCH( ref .

file_windows_amd64.go sẽ chỉ được biên dịch trên win64.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.