01 hello world
总所周知,“Hello World”是程序员的一种仪式感。
而这一行“Hello World”,一定会涉及到输入输出相关的方法。所以,如何导入包,是我们需要研究的第一步。
在C语言中,我们使用include,在Java中,我们使用了import。在Golang中也一样,我们使用import引入其他的包。在上一篇文章中,我们已经提到了对于导入的包,编译器会首先在GOROOT中寻找,随后会在项目所对应的GOPATH中寻找,最后才是在全局GOPATH中寻找,如果都无法找到,编译器将会报错。
注意,在Golang中和Java有一点很大的区别,就是在Golang中,import导入的是目录,而不是包名。而且,Golang没有强制要求包名和目录名需要一致。
下面举一些例子来说明在Golang中包名和目录的关系,先来看看目录结构:
可以看出,我们在src下面设置了两个文件夹,在第二个文件夹下面设置了两个go文件。 来看看这两个文件的代码,
test1.go如下:
package pktest
func Func1(){
println("这是第一个函数")
}
test2.go:
package pktest
func Func2(){
println("这是第二个函数")
}
testmain.go:
package main
import "package1/package2"
func main() {
pktest.Func1()
}
我们在调用Func1这个函数的时候,使用的是pktest,而不是我们认为的package1/package2中的package2。这是因为在Golang中,没有强制要求包名和目录名称一致。也就是说,在上面的例子中,我们引用路径中的文件夹名称是package2,而在这个文件夹下面的两个文件,他们的包名,却被设置成了pktest。而在Golang的引用中,我们需要填写的是源文件所在的相对路径。 也就是说,我们可以理解为,包名和路径其实是两个概念,文件名在Golang中不会被显式的引用,通常的引用格式是packageName.FunctionName。
结论如下:
import导入的是源文件的相对路径,而不是包名。 在习惯上将包名和目录名保证一致,但这并不是强制规定(但不建议这么做,这样容易造成调用这个包的人,无法快速知道这个包的名称是什么) 在代码中引用包内的成员时,使用包名而不是目录名。 在一个文件夹内,只能存在一种包名,源文件的名称也没有其他的限制。 如果多个文件夹下有相同名字的package,它们其实是彼此无关的package。