因为之前一直在使用Python,刚刚开始学习Go语言,就遇到了一个缠人的小妖精,那就是Go语言怎么才能导入外部的包。Python的很简单,直接包名就是文件名,包内的方法的调用就是包名+函数名(参数)。而刚开始学习Go的时候,就发现既要有文件名,要有包名(package),还有方法。一时间这三者的关系很难厘清。经过了一些尝试总算也是有一些收获。举个例子:
一个文件,文件名为file,file里面有一个test.go的文件,这是我要导入的。
这个test.go文件里的package名为packagetest
test.go里面的func Test(){...}方法是我最后要调用的
那么OK,来捋一下现在有文件夹file, GO文件test.go, GO文件里面设置的包名packagetest和调用的方法Test()。其实在调用的过程中import是file的路径,方法的调用是packagetest.Test()。看到这里想必也就能够看明白了,这里没有test.go这个文件名什么事。系统在调用的时候直接查找的是.go文件里package的包名。
在写完上面的一个小时后我在查看go的源码文件时发现,go这样做的用意。
一个文件路径下面只能有一个包名,但是可以有多个文件。例如file这个文件下面有test1.go和test2.go,如果这两个.go文件里面的包名一致的话,是不会出问题的,相当于是一个包分别存在两个文件之中,他们相互之间的函数调用也就想是在一个文件中一样。但是如果两个.go文件的包名不一样,系统就会报错。
go语言里确实是一个目录下的所有.go文件必须都属于一个package,否则会编译报错。
个人理解是,正是由于这个原因,所以在import的时候,导入到目录级别就可以了,因为只要能编译通过,目录下直属本目录的.go文件的package定义肯定就是本包的定义。
go语言里函数或者变量的可见范围也是根据包归类的。
#1