Làm thế nào tôi có thể chạy được một dự án với nhiều tệp trong gói chính?


150

Tôi hiện có một tập tin duy nhất trong gói chính của tôi được gọi main.go. Làm cách nào để chia nội dung main.gothành nhiều tệp mà không tạo gói riêng vì mã không thể sử dụng lại được.

Tôi muốn một cấu trúc thư mục như thế này:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

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

Sau đó trong main.go

package main

func main() {
    Bar()
}

Nhưng go run main.gocho tôi:

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

Câu trả lời:


204

Cập nhật ngày 26 tháng 7 năm 2019 (cho đi> = 1.11)

go run .

Câu trả lời gốc

Các mã ở trên thực sự hoạt động. Vấn đề là tôi cần phải chạy

go run *.go

thay vì

go run main.go

6
Trừ khi bạn có *_test.gotrong thư mục của bạn. Sau đó, bạn cần (1) shopt -s ext globvà (2) go run !(*_test).go.
getWeberForStackExchange

và những gì về những người sử dụng appengine?
goodies4uall

Tôi đã thử go run ./cmd/myCmd/...và nó làm việc cho tôi. Có lẽ đây là cách chính xác khi có _test.gotập tin?
VinGarcia

go run ../your_foldertừ bên trong thư mục làm việc cho tôi
Andy

3
Chỉ cần làmgo run .
BarthesSimpson

66

Cập nhật tháng 8 năm 2018, với Go 1.11 , phần "Chạy" trạng thái:

Các go runlệnh bây giờ cho phép một con đường nhập khẩu duy nhất, một tên thư mục hoặc một mô hình phù hợp với một gói duy nhất.
Điều này cho phép go run pkghoặc go run dir, quan trọng nhấtgo run .


Câu trả lời gốc tháng 1 năm 2015

Như đã đề cập trong " Cách biên dịch chương trình Go bao gồm nhiều tệp? ", go runMong đợi một danh sách các tệp, vì nó "biên dịch và chạy maingói chứa các tệp nguồn Go có tên".
Vì vậy, bạn chắc chắn có thể chia maingói của bạn trong một số tập tin với go run.

Điều đó khác với go build/go installmong đợi tên gói (và không đi tên tệp).
Một đơn giản go buildsẽ tạo ra một thực thi được đặt tên theo thư mục cha.

Lưu ý rằng, như được minh họa bởi luồng này , go run *.gosẽ không hoạt động trong phiên Windows CMD, vì shell không thực hiện mở rộng ký tự đại diện .


1
Có một cách giải quyết để chạy nhiều tệp đi bằng runcách sử dụng dấu nhắc lệnh của Windows không?
Luke

1
Cảm ơn! Điều này đã giúp tôi một tấn. Tôi đã tự hỏi tại sao tôi không thể chạy mã chỉ với main.go vì nó là cùng một gói nhưng nó có ý nghĩa với tôi về lý do tại sao họ không cho phép điều đó.
Chris

4

Như đã đề cập, bạn có thể nói go run *.gonhưng đối với Windows, bạn chỉ có thể liệt kê các tệp tập lệnh (vì * .go sẽ không hoạt động) -go run main.go other.go third.go


3

Theo tôi, câu trả lời tốt nhất cho câu hỏi này được ẩn trong các bình luận cho câu trả lời hàng đầu.

Chỉ cần chạy này:

go run .

Điều này sẽ chạy tất cả các tệp trong gói chính, nhưng sẽ không đưa ra thông báo lỗi như

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

Chuyển sang @BarthesSimpson


0

Đối với Windows, cài đặt Cygwin và sử dụng nó thay cho dấu nhắc lệnh. "đi chạy * .go" sẽ hoạt động sau đó.


Tôi sẽ đề nghị MinGW cho điều đó, nhưng cách tiếp cận là đúng nếu bạn hỏi tôi. Tôi nghi ngờ rằng bất cứ ai cũng có thể thực sự gắn bó về mặt cảm xúccmd.exe
Aleksandr Kravets

0

Nếu bạn đang cố chạy nhiều tệp trên localhost bằng gorilla mux theo phiên bản mới nhất (1.11). Hãy thử sử dụng bất kỳ 2 lệnh sau.

  1. đi cài đặt && FolderName -port 8081.

  2. đi xây dựng && ./FolderName -port 8081.

Đảm bảo rằng bạn đang ở trong thư mục nguồn tức là go / src / FolderName trước khi thực hiện lệnh trong Terminal.

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.