go run的一个小细节
wyd_npu · · 13823 次点击 · · 开始浏览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当脚本用的时候要注意下。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
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当脚本用的时候要注意下。