我们看到hellogo.go中import一个名为fmt的包,并利用该包内的Printf函数输出"Hello, Go!"。直觉告诉我们fmt包似乎是一个标准库中的包。没错,fmt包提供了格式化文本输出以及读取格式化输入的相关函数,与C中的printf或 scanf等类似。我们通过import语句将fmt包导入我们的源文件后就可以使用该fmt包导出(export)的功能函数了(比如 Printf)。
在C中,我们通过static来标识局部函数还是全局函数。而在Go中,包中的函数是否可以被外部调用,要看该函数名的首母是否为大写。这是一种 Go语言固化的约定:首母大写的函数被认为是导出的函数,可以被包之外的代码调用;而小写字母开头的函数则仅能在包内使用。在例子中你也看到了 fmt包的Printf函数其首母就是大写的。
四、GOPATH
把上面的hellogo.go稍作改造,拆分成两个文件:main.go和hello.go
//hello.go
package hello
import "fmt"
func Hello(who string){
fmt.Printf("Hello,%s!n", who)
}
//main.go
package main
import "hello"
func main(){
hello.Hello("GO")
}
用go build编译main.go 结果如下
[root@localhost go-examples]# go build main.go
main.go:4:8: import "hello": cannot find package
编译器居然提示无法找到hello这个package,而hello.go中明明定义了package hello了。这是怎么回事呢?原来go compiler搜索package的方式与我们常规理解的有不同,Go在这方面也有一套约定,这里面涉及到一个重要的环境变量:GOPATH。我们可以使用go help gopath来查看一下有关gopath的manual。
Go compiler的package搜索顺序是这样的,以搜索hello这个package为例:
* 首先,Go compiler会在GO安装目录(GOROOT,这里是/home/go/)下查找是否有src/pkg/hello相关包源码;如果没有则继续;
* 如果export GOPATH=PATH1:PAHT2,则Go compiler会依次查找是否存在PATH1/src/hello、PATH2/src/hello;配置在GOPATH中的PATH1和PATH2被称作workplace;
* 如果在上述几个位置均无法找到hello这个package,则提示出错。
在本例子中,我们尚未设置过GOPATH环境变量,也没有建立类似PATH1/src/hello这样的路径,因此Go compiler显然无法找到hello这个package了。我们来设置一下GOPATH变量并建立相关目录:
[root@localhost go-examples]# export GOPATH=/home/go-examples/
[root@localhost go-examples]# mkdir src/hello -p
[root@localhost go-examples]# mv hello.go src/hello/










