ฉันจะ "เรียกใช้" โครงการที่มีหลายไฟล์ในแพ็คเกจหลักได้อย่างไร


150

main.goฉันกำลังมีไฟล์เดียวในแพคเกจหลักของฉันเรียกว่า ฉันจะแบ่งเนื้อหาของmain.goออกเป็นหลายไฟล์ได้อย่างไรโดยไม่ต้องสร้างแพ็คเกจแยกต่างหากเพราะรหัสไม่สามารถใช้ซ้ำได้

ฉันต้องการโครงสร้างไดเรกทอรีเช่นนี้

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

func Bar() {
    fmt.Println("Bar")
}

จากนั้นใน main.go

package main

func main() {
    Bar()
}

แต่go run main.goให้ฉัน:

# command-line-arguments
./main.go:4:2: undefined: Bar

คำตอบ:


204

อัปเดต 26 กรกฎาคม 2019 (ไป> = 1.11)

go run .

คำตอบเดิม

รหัสด้านบนใช้งานได้จริง ปัญหาคือฉันต้องทำงาน

go run *.go

แทน

go run main.go

6
ถ้าคุณไม่มี*_test.goในโฟลเดอร์ แล้วคุณจะต้อง (1) shopt -s ext globและ go run !(*_test).go(2)
getWeberForStackExchange

แล้วผู้ใช้แอปเพนineล่ะ?
goodies4uall

ฉันพยายามgo run ./cmd/myCmd/...แล้วมันก็ใช้ได้ผลสำหรับฉัน อาจเป็นวิธีที่ถูกต้องเมื่อมี_test.goไฟล์หรือไม่
VinGarcia

go run ../your_folderจากภายในโฟลเดอร์ที่ทำงานได้ผลกับฉัน
Andy

3
เพิ่งทำgo run .
BarthesSimpson

66

ปรับปรุงสิงหาคม 2018 ด้วยการไป 1.11เป็นส่วน "Run"รัฐ:

go runคำสั่งขณะนี้ช่วยให้เส้นทางนำเข้าเดียวชื่อไดเรกทอรีหรือรูปแบบที่ตรงกับแพคเกจเดียว
สิ่งนี้จะช่วยให้go run pkgหรือgo run dirที่สำคัญที่สุดgo run .


คำตอบเดิมมกราคม 2015

ดังที่กล่าวไว้ใน " วิธีการคอมไพล์โปรแกรม Go ที่ประกอบด้วยหลายไฟล์? " go runคาดว่าจะมีรายการไฟล์เนื่องจากมัน "คอมไพล์และเรียกใช้mainแพคเกจที่ประกอบด้วยไฟล์ซอร์สที่มีชื่อว่า Go"
ดังนั้นคุณสามารถแยกmainแพ็คเกจออกเป็นหลายไฟล์go runได้อย่างแน่นอน

ซึ่งแตกต่างจากgo build/go installที่คาดหวังชื่อแพคเกจ (และไม่ใช่ชื่อไฟล์)
วิgo buildจะสร้างแฟ้มที่เรียกใช้งานได้หลังจากชื่อโฟลเดอร์หลัก

โปรดทราบว่าในขณะที่แสดงโดยหัวข้อนี้เป็นgo run *.goจะไม่ทำงานในเซสชั่นของ Windows CMD ตั้งแต่เปลือกไม่ได้ทำสัญลักษณ์แทนการขยายตัว


1
มีวิธีแก้ปัญหาสำหรับการเรียกใช้ไฟล์หลายไฟล์ด้วยการrunใช้พรอมต์คำสั่ง Windows หรือไม่
ลุค

1
ขอบคุณ! สิ่งนี้ช่วยฉันได้มาก ฉันยังคงสงสัยว่าทำไมฉันไม่สามารถเรียกใช้รหัสด้วย main.go เพียงเพราะมันเป็นแพ็คเกจเดียวกัน แต่มันก็สมเหตุสมผลสำหรับฉันว่าทำไมพวกเขาถึงไม่ยอมให้ทำเช่นนั้น
Chris

5

ดังที่กล่าวไว้คุณสามารถพูดได้go run *.goแต่สำหรับ Windows คุณสามารถแสดงรายการไฟล์สคริปต์ (เนื่องจาก * .go ใช้งานไม่ได้) -go run main.go other.go third.go


ใช่ที่ถูกต้อง. ใน windows ฉันต้องทำงานgo run .
KTM

3

ในความคิดของฉันคำตอบที่ดีที่สุดสำหรับคำถามนี้ถูกซ่อนอยู่ในความคิดเห็นต่อคำตอบสูงสุด

เรียกใช้สิ่งนี้:

go run .

สิ่งนี้จะเรียกใช้ไฟล์ทั้งหมดในแพ็คเกจหลัก แต่จะไม่ให้ข้อความผิดพลาดเช่น

go run: cannot run *_test.go files (main_test.go)

Kudos ถึง @BarthesSimpson


0

สำหรับ Windows ให้ติดตั้ง Cygwin และใช้แทน command prompt "go run * .go" จะใช้งานได้


ฉันอยากจะแนะนำ MinGW สำหรับสิ่งนั้น แต่วิธีการที่ถูกต้องถ้าคุณถามฉัน ฉันสงสัยว่าใคร ๆ ก็สามารถติดอารมณ์ได้จริงๆcmd.exe
Aleksandr Kravets

0

หากคุณพยายามที่จะเรียกใช้ไฟล์หลายไฟล์บน localhost โดยใช้กอริลลา mux ไปตามรุ่นล่าสุด (1.11) ลองใช้คำสั่ง 2 ข้อต่อไปนี้

  1. ไปติดตั้ง && ชื่อโฟลเดอร์ - พอร์ต 8081

  2. ไปสร้าง && ./FolderName - พอร์ต 8081

ตรวจสอบให้แน่ใจว่าคุณอยู่ในโฟลเดอร์ต้นทางเช่น go / src / FolderName ก่อนดำเนินการคำสั่งใน Terminal

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