3.2.3 自己编写非执行包

自己编写的非执行包也可以用类似的方法引用。下面我们将继续以Hello world!为例来说明如何编写非执行包并在其他包中引用。

首先,在src目录下新建一个子目录package1,在其中新建一个代码文件package1.go,内容见代码3-6。

package package1

import (
  "fmt"
)

func Hello() {
  fmt.Println("Hello world!")
}

代码3-6 package1/package1.go

然后,在src目录下再新建一个子目录test1,在其中新建一个代码文件test1.go,内容见代码3-7。

package main

import (
  "package1"
)

func main() {
  package1.Hello()
}

代码3-7 test1/test1.go

最后,直接编译并执行test1包可以得到与代码3-1相同的输出结果,如图3.18所示。

图3.18 执行test1.go代码

我们再来研究一下这两个包的代码。package1包的代码中,首先用以下代码

package package1

声明了自己的包名是“package1”。接下来的import语句导入了fmt包。

import (
  "fmt"
)
func Hello() {
  fmt.Println("Hello world!")
}

以上几行代码定义了一个Hello函数,功能是输出“Hello world!”字样。特别要注意,在这里Hello函数的名字中,首字母H必须是大写字母。这是因为Go语言强制要求一个包中能够被其他包调用的函数必须是以大写字母开始命名的(这样的函数称作exported function,即“被导出的”函数),小写字母开始的函数仅能在本包内部使用,对于其他包来说是“不可见”的。这也是Go语言与其他语言的一个显著的不同之处,有些从其他开发语言过渡过来的开发者一开始会不适应。

再来看test1包,其中代码第一行声明了自己是main包,也就是可执行包。

package main

然后,import语句中直接引用了package1这个包。

import (
  "package1"
)

接下来的可执行程序主函数main中,通过“包名+.+函数名”的方式调用了package1包中的Hello函数。

func main() {
  package1.Hello()
}

这个例子完整地演示了如何编写非执行包、如何在可执行包中引用自己编写的非执行包。package1就是一个非执行包,而test1是一个可执行包,test1包中调用了package1包中的Hello函数,输出了所需的文字信息。