go语言中目录名、文件名、包名之间关系

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

go语言中目录名、文件名、包名之间关系_第1张图片

test.go

go语言中目录名、文件名、包名之间关系_第2张图片

 

正确的编译命令应该是: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无法解析的问题还存在。

所以在写代码的时候,还是规范点,用包名.函数名的形式来调用吧。

这个问题搞了好久,谷歌搜遍了都没有,最后偶然才发现这么一篇文章解释了。

 

 

你可能感兴趣的:(go)