ข้อตกลงสำหรับชื่อไฟล์ใน Go คืออะไร?


118

ฉันพบข้อตกลงในการตั้งชื่อแพ็คเกจใน Go: ไม่มีขีดล่างระหว่างคำตัวพิมพ์เล็กทุกคำ

หลักการนี้ใช้กับชื่อไฟล์ด้วยหรือไม่?

คุณใส่โครงสร้างเดียวในไฟล์เดียวเหมือนกับที่คุณทำกับคลาส java แล้วตั้งชื่อไฟล์ตามโครงสร้างหรือไม่

ปัจจุบันถ้าฉันมี Struct WebServer ฉันจะใส่ไว้ในไฟล์ web_server.go


3
AFAIK ไม่มีอนุสัญญา แต่ _ คำต่อท้ายอาจมีความหมายพิเศษในอนาคตดังนั้นฉันขอแนะนำให้หลีกเลี่ยง
fuz

คำตอบ:


132

มีหลักเกณฑ์บางประการที่ต้องปฏิบัติตาม

  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

2
@AbhijeetRastogi: golang.org/pkg/go/buildและgolang.org/cmd/go
JimB

3
สิ่งที่ฉันควรจะทำอย่างไรถ้าฉันต้องการที่จะสร้างสำหรับและunix othersเช่นฉันสามารถสร้างไฟล์สองไฟล์file_windows.goและfile_others.go. มันทำงานได้ดี แต่สำหรับfile_unix.goและfile_others.goมันไม่ได้ผล darwin freebsg linux openbsd netbsd dragonfly solaris androidฉันไม่ต้องการที่จะสร้างไฟล์แปด
Ivan Black

3
@Fire: โดยทั่วไปชื่อไฟล์จะเป็นตัวพิมพ์เล็กทั้งหมดในกรณีทั้งเพื่อความสอดคล้องและสำหรับระบบที่มีระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
JimB

1
สำหรับใครก็ตามที่มีคำถามเดียวกันกับ @IvanBlack สามารถทำได้โดยใช้แท็กรุ่น ดูภาพรวมของวิธีการทำที่นี่: dave.cheney.net/2013/10/12/…
Ian Gustafson

33

นอกจากคำตอบที่ JimBให้มาแล้วชื่อไฟล์ทั่วไปยังเป็นตัวพิมพ์เล็กสั้นและไม่มีขีดล่างหรือเว้นวรรค โดยทั่วไปชื่อไฟล์จะเป็นไปตามหลักการเดียวกันกับชื่อแพ็กเกจ ดูแพ็กเกจรายชื่อส่วนหนึ่งของที่มีประสิทธิภาพไป

ดูแพ็คเกจ strconvสำหรับตัวอย่างที่ดี


5
คุณตั้งชื่อไฟล์ยาว ๆ ว่าอะไร mycommandsub1command.goหรือmy_command_sub1command.goแล้วmycommandVO
user2727195

10
ฉันขอแนะนำขีดล่างสำหรับชื่อยาว ๆ เคยเห็นสิ่งนี้ในโครงการดีๆ
Avi

18

Go ค่อนข้างเสรีในแง่ของวิธีการจัดระเบียบโค้ดของคุณภายในแพ็กเกจโดยทั่วไปสิ่งที่ช่วยเพิ่มความสามารถในการอ่านและทำความเข้าใจโค้ดของคุณ วิธีที่ดีที่สุดในการเรียนรู้วิธีการนี้คือการศึกษาผู้เชี่ยวชาญกล่าวคือเรียกดูผ่านไลบรารีมาตรฐาน:

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

มีกฎ 2 ข้อที่ฉันคิดได้ เมื่อระบุโค้ดที่จะคอมไพล์สำหรับแพลตฟอร์มต่างๆคุณใช้ชื่อแพลตฟอร์มเป็นคำต่อท้าย:

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 .
david

1
ผมคิดว่าพวกเขาจะไม่ใช้_front, _writerหรือ_bitsเป็นคำต่อท้ายอย่างมีนัยสำคัญในอนาคตแล้ว!
Matt Harrison

ฉันชอบ Go แต่goเครื่องมือนี้มีข้อ จำกัด มากเกี่ยวกับโครงสร้างแพ็คเกจ (เป็นหนึ่งในสิ่งที่ฉันชอบเกี่ยวกับภาษา) มันชอบการประชุมที่เฉพาะเจาะจงมาก (หนึ่งแพ็คเกจต่อโฟลเดอร์ [อย่างน้อยหนึ่งข้อยกเว้น] แพ็คเกจของโฟลเดอร์แชร์ชื่อเดียวกันกับโฟลเดอร์ [โดยมีข้อยกเว้นอย่างน้อยหนึ่งรายการ] พา ธ การนำเข้าแพ็กเกจแบบเต็มตรงกับพา ธ สัมพัทธ์จาก$GOPATHบางไฟล์ ปฏิบัติแตกต่างกันไปตามรูปแบบชื่อ ฯลฯ )
weberc2

1
@ weberc2 ข้อ จำกัด นั้นคล้ายคลึงกับลาเท็กซ์ อันดับแรกฉันต้องการควบคุมการจัดวางและรายละเอียดอื่น ๆ ที่ไม่เกี่ยวข้องจนกว่าฉันจะรู้ว่าสิ่งที่ต้องเขียนคือเนื้อหาที่ดี ในทำนองเดียวกัน Go ช่วยให้เราสามารถเขียนโค้ดที่ดีและจัดการรายละเอียดอื่น ๆ ให้เราได้
david

@david ฉันเห็นด้วย ในการหวนกลับผมก็ไม่มีความชัดเจน: Go is quite liberal in terms of how you organise your code within a packageผมได้รับการตอบสนองต่อคำสั่งของผู้ตอบ Go ไม่เสรี แต่ค่อนข้าง จำกัด แต่นั่นเป็นสิ่งที่ดี
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 เท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.