這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Golang的一個優勢就是編譯快,可以當指令碼語言使用,利用go run直接執行.go檔案,就像執行指令碼一樣。
我很喜歡這點,一般都懶得build。但在嘗試beego(https://github.com/astaxie/beego)架構時,剛照著寫了個hello world,總是不對,提示找不到模版。
開始了漫長的調試,查看原始碼、修改配置、、、各種不行。
2013/05/01 10:03:11 [C] [Handler crashed with error can't find templatefile in the path:index.tpl]
2013/05/01 10:03:11 [C] [/build/buildd/golang-1/src/pkg/runtime/proc.c 1443]
2013/05/01 10:03:11 [C] [/usr/lib/go/src/pkg/github.com/astaxie/beego/controller.go 178]
2013/05/01 10:03:11 [C] [/usr/lib/go/src/pkg/github.com/astaxie/beego/controller.go 92]
2013/05/01 10:03:11 [C] [/usr/lib/go/src/pkg/reflect/value.go 521]
2013/05/01 10:03:11 [C] [/usr/lib/go/src/pkg/reflect/value.go 334]
2013/05/01 10:03:11 [C] [/usr/lib/go/src/pkg/github.com/astaxie/beego/router.go 375]
2013/05/01 10:03:11 [C] [/usr/lib/go/src/pkg/net/http/server.go 656]
2013/05/01 10:03:11 [C] [/build/buildd/golang-1/src/pkg/runtime/proc.c 271]
那調試下吧:
go build main.go
gdb ./main
run
居然好了。
直接執行 ./main,也好的。
再看了遍相關代碼,beego裡找配置、模版等檔案都是從當前執行目錄下尋找相關子目錄。
beego.go 48: AppPath, _ = os.Getwd()
懷疑是不是go run的執行路徑不是當前路徑。
察看下go run的協助:
go help run
usage: go run [build flags] gofiles... [arguments...]
Run compiles and runs the main package comprising the named Go source files.
For more about build flags, see 'go help build'.
See also: go build.
看這個意思,就是自動編譯+運行。。。
首先懷疑的是,這個路徑是不是go工具所在路徑。
驗證:
go run ./main.go
ps 下,恩哼,a.out哪來的?
49391 pts/1 00:00:00 go
49399 pts/1 00:00:00 a.out
看下詳細的:
0 1000 49391 42236 20 0 66416 5204 ffffff Sl+ pts/1 0:00 go run ./main.go
0 1000 49399 49391 20 0 146000 4272 ffffff Sl+ pts/1 0:00 /tmp/go-build402905850/command-line-arguments/_obj/a.out
這裡就很清楚了,go run 命令其實就是跑到 /tmp目錄建立個 /go-buildxxxx目錄,編譯然後運行。
這個可能會帶來個小問題,
1. 如果依賴相對路徑的檔案的話,就像上面的,就會有問題;
2. 如果不斷執行,就會不斷的產生新的臨時檔案。
所以golang當指令碼用的時候要注意下。