Bagaimana saya bisa "menjalankan" proyek dengan banyak file dalam paket utama?


150

Saat ini saya memiliki satu file dalam paket utama saya yang disebut main.go. Bagaimana cara membagi konten main.gomenjadi beberapa file tanpa membuat paket terpisah karena kode tidak dapat digunakan kembali.

Saya ingin struktur direktori seperti ini:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

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

Lalu masuk main.go

package main

func main() {
    Bar()
}

Tapi go run main.goberi saya:

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

Jawaban:


204

Perbarui 26 Juli 2019 (untuk go> = 1.11)

go run .

Jawaban asli

Kode di atas benar-benar berfungsi. Masalahnya adalah saya harus lari

go run *.go

dari pada

go run main.go

6
Kecuali Anda punya *_test.godi folder Anda. Maka Anda perlu (1) shopt -s ext globdan (2) go run !(*_test).go.
getWeberForStackExchange

dan bagaimana dengan mereka yang menggunakan appengine?
goodies4uall

Saya mencoba go run ./cmd/myCmd/...dan itu berhasil untuk saya. Mungkin ini cara yang benar ketika ada _test.gofile?
VinGarcia

go run ../your_folderdari dalam folder yang berfungsi bekerja untuk saya
Andy

3
Lakukan sajago run .
BarthesSimpson

66

Pembaruan Agustus 2018, dengan Go 1.11 , bagian "Jalankan" menyatakan:

The go runperintah sekarang memungkinkan jalur impor tunggal, nama direktori atau pola pencocokan satu paket.
Ini memungkinkan go run pkgatau go run dir, yang paling pentinggo run .


Jawaban asli Januari 2015

Seperti disebutkan dalam " Bagaimana cara mengkompilasi program Go yang terdiri dari beberapa file? ", go runMengharapkan daftar file, karena "mengkompilasi dan menjalankan mainpaket yang terdiri dari file Go source yang bernama".
Jadi Anda tentu dapat membagi mainpaket Anda menjadi beberapa file dengan go run.

Itu berbeda dari go build/go installyang diharapkan nama paket (dan tidak pergi nama file).
Sederhana go buildakan menghasilkan executable bernama setelah folder induk.

Perhatikan bahwa, sebagai diilustrasikan oleh utas ini , a go run *.gotidak akan berfungsi dalam sesi Windows CMD, karena shell tidak melakukan ekspansi wildcard .


1
Apakah ada solusi untuk menjalankan beberapa file go dengan runmenggunakan command prompt Windows?
Lukas

1
Terima kasih! Ini membantu saya satu ton. Saya terus bertanya-tanya mengapa saya tidak bisa menjalankan kode hanya dengan main.go karena itu adalah paket yang sama tetapi masuk akal bagi saya mengapa mereka tidak mengizinkannya.
Chris

5

Seperti yang disebutkan, Anda bisa mengatakan go run *.gotetapi untuk Windows Anda bisa daftar file skrip (karena * .go tidak akan bekerja) -go run main.go other.go third.go


Ya itu benar. Di windows saya harus menjalankango run .
KTM

3

Menurut pendapat saya, jawaban terbaik untuk pertanyaan ini tersembunyi di komentar untuk jawaban teratas.

Jalankan saja ini:

go run .

Ini akan menjalankan semua file dalam paket utama, tetapi tidak akan memberikan pesan kesalahan seperti

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

Kudos to @BarthesSimpson


0

Untuk Windows, instal Cygwin dan gunakan sebagai ganti command prompt. "Go run * .go" akan berfungsi kemudian.


Saya akan menyarankan MinGW untuk itu, tetapi pendekatannya tepat jika Anda bertanya kepada saya. Saya ragu ada orang yang bisa terikat secara emosionalcmd.exe
Aleksandr Kravets

0

Jika Anda mencoba menjalankan beberapa file di localhost menggunakan gorilla mux in go sesuai versi terbaru (1.11). Coba gunakan salah satu dari 2 perintah berikut.

  1. pergi instal && FolderName -port 8081.

  2. buka build && ./FolderName -port 8081.

Pastikan bahwa Anda berada di folder sumber yaitu pergi / src / FolderName sebelum menjalankan perintah di Terminal.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.