1, 目录结构
main函数所在文件的文件名,没有要求,可以是main.go,test.go或者任意其他的文件名,但func main()必须仅有一个。在用go install命令编译的时候,后面跟的main函数所在文件的文件夹的名字,编译出来的可执行文件也是和文件夹名相同的。
比如test项目有以下目录结构
test
- src
-- config-folder
--- config-file.go // 在这个文件里定义package config。注意定义的包名和文件名不同。
-- test-folder
-- test.go // 或者叫 main.go也行,编译器关注的是文件夹名而不是main函数的文件名
config-file.go
test.go
正确的编译命令应该是:go install test-folder
如果写成go install test,会出现如下错误
go\project\test>go install test
can't load package: package test: cannot find package "test" in any of:
go\src\test (from $GOROOT)
go\project\test\src\test (from $GOPATH)
再来看config包。
在main函数中,import的是config包所在的目录名称。在函数中调用的是包的名称。
而无论目录名称和包的名称,与config包所在文件的文件名是没有任何关系的。
因此可以看出,go认的是目录名和包名,而不是文件名。import的是目录名,调用的是包名。
2,源码要放在哪里?
如果要用emacs + gocode + godef的方案,
源码需要放在GOPATH/src文件夹下。
这样godef才能正确找到各种包进行分析
3. 包的import
https://github.com/fatih/vim-go/issues/277
看起来用别名,导致godef无法解析的问题还存在。
所以在写代码的时候,还是规范点,用包名.函数名的形式来调用吧。
这个问题搞了好久,谷歌搜遍了都没有,最后偶然才发现这么一篇文章解释了。