2014-05-16 27 views
33

我是Go的新手。我非常喜歡這種語言,但我很快意識到,由於程序大小的增加,我需要開始分割我的文件。Golang:通過命令行運行當前目錄下的所有.go文件(多文件包)

go run main.go(與main.go已經用我的main()函數的文件)

沒有工作,我打了一個屏障了一段時間,因爲我根本不知道如何讓我的程序工作。

一些快速搜索導致我的

go run main.go other.go ..

如果答案通過鍵入所有我package main包含的文件,我能得到的編程運行。然而,這每次都是非常麻煩和令人沮喪的。

我寫了以下自我回答的問題,以防止像我這樣的人再次碰到這個障礙。

回答

16

的Unix相關係統

go run *.go將在大多數情況下足夠了。

如果這導致錯誤,繼續下面的方法。

Windows系統(並且在其它情況下,go run *.go不工作)

令牌膨脹不會在windows命令行工作,因此上述將不起作用,並且顯示錯誤。由於當前的編譯器限制,在某些情況下,go run *.go也可能無法在OS中使用。

在這些情況下,使用

go build && foo.exe

其中foo.exe是產生.exe文件的名稱。 如果您可能不知道可執行文件的名稱是什麼,請首先執行

go build並檢查生成的.exe文件的名稱。之後,使用包含文件名的方法。

這兩種方法將構建並運行當前目錄中的所有.go文件,同時最小的麻煩。

+0

如何在子文件夾中的文件夾下運行* .go? –

3

如果我理解你的問題,你需要導入其他代碼作爲庫。

小例子

./testing/main.go:

package main 

import "fmt" 
import L "testing/lib" 

func main() { 
    fmt.Println("Hello from main()") 
    L.Somefunc() 
} 

./testing/lib/somelib。去:

package lib 

import "fmt" 

func Somefunc() { 
    fmt.Println("Hello from Somefunc()") 
    return 
} 

要啓動 - go run main.go

+1

這是Windows上開發人員的正確答案。在我的情況下,我不得不使用完全合格的路徑'import「github.com/abacaj/hello/lib」',然後像'sc:= new(lib.ServiceControl)' – AntonB

49

由於Nate Finch筆記:

Go run is ... really only meant to be used on very small programs, which generally only need a single file.

即使在UNIX上,go run *.go往往是不正確的。在單元測試(一個項目應該有單元測試)的任何項目,這會給錯誤:上

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

這也將忽略構建的限制,所以_windows.go文件將被編譯(或試圖編譯) Unix,這不是你想要的。

已經有製作go run工作像go命令的休息bit of discussion,並有一個開放的CL它(5164)。目前正在考慮Go 1.4。在此期間,在所有平臺上推薦的解決方案是:

go build && ./<executable> 
8

的最好辦法做到這一點是這樣運行的:

go run !(*_test).go 

據跳過所有測試文件,這正是您需要避免錯誤。

其他建議:

go build && ./<executable> 

是有點討厭。你必須隨時刪除可執行文件,以避免被git標記。你可以把它放在gitignore當然,但我很懶,這是一個額外的步驟。

+3

一樣使用它不工作「-bash:!:event not found「 – user1872384

+0

@ user1872384你應該首先運行'shopt -s extglob'來啓用'!(...)'通配符語法 –

4

您可以運行所有.go文件,但不包括測試,使用這種慶典結構:

go run $(ls -1 *.go | grep -v _test.go) 
+1

這應該是被接受的答案。它解決了* nix開發者的問題 – MusikPolice

1

在Windows上,我通常只加一點test.bat的我所有的項目目錄:

go build 
.\{project_name}.exe 
go clean 

工作得不錯。當然,請將{project_name}替換爲可執行文件的名稱。一旦可執行文件完成,批處理腳本就會進行清理。

1

只是用這個

go run *.go 

它會工作假設你不具備任何測試文件

+0

我在找什麼!Thx! – Macilias

1

這裏是我的解決方案:

go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1) 

我用它與別名以使它很容易運行命令行應用程序

alias gorun='go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)' 

$ gorun param1 param2 
相關問題