包里面可以包含init
函数。init
函数没有返回值,没有参数。代码中不能显式地调用init
函数。init
函数原型如下所示:
func init() {
}
init
函数可用于执行初始化任务。
包的初始化顺序如下
- 包级别的变量首先被初始化。
init
函数随后被调用。一个包可以有多个init
函数(可以在单个文件中,也可以分布在多个文件中),它们是按照编译顺序调用的。
如果一个包导入其他包,则首先初始化被导入的包。
一个包只初始化一次,即使它被多个包导入。
让我们对示例程序做一些修改来理解init
函数。
首先,让我们向rectprops.go
添加一个init
函数。
rectprops.go
package rectangle
import "math"
import "fmt"
/*
* init 函数
*/
func init() {
fmt.Println("rectangle package initialized")
}
func Area(len, wid float64) float64 {
area := len * wid
return area
}
func Diagonal(len, wid float64) float64 {
diagonal := math.Sqrt((len * len) + (wid * wid))
return diagonal
}
我们添加了一个简单的init
函数,它只打印一条信息。
现在修改主包。矩形的长度和宽度应该大于零,我们将在geometry.go
文件中使用init
函数来对此进行检查。
修改geometry.go
文件:
package main
import (
"fmt"
"geometry/rectangle" //导入自定义包
"log"
)
// 1. 包变量
var rectLen, rectWidth float64 = 6, 7
// 2. 初始化函数,检查长度和宽度是否大于零
func init() {
println("main package initialized")
if rectLen < 0 {
log.Fatal("length is less than zero")
}
if rectWidth < 0 {
log.Fatal("width is less than zero")
}
}
func main() {
fmt.Println("Geometrical shape properties")
fmt.Printf("area of rectangle %.2f\n", rectangle.Area(rectLen, rectWidth))
fmt.Printf("diagonal of the rectangle %.2f ",rectangle.Diagonal(rectLen, rectWidth))
}
下面是对geometry.go
所做的更改
rectLen
和rectWidth
变量从主函数级别移动到包级别。- 添加了
init
函数。init
函数调用了log.Fatal
函数,如果rectLen
或rectWidth
小于0,则将终止程序执行并打印日志。
主包的初始化顺序是
- 导入的包首先被初始化。因此,首先初始化矩形包。
- 包级别变量
rectLen
和rectWidth
将被初始化。 - 调用
init
函数。 - 最后调用主函数。
如果运行该程序,将得到以下输出。
rectangle package initialized
main package initialized
Geometrical shape properties
area of rectangle 42.00
diagonal of the rectangle 9.22
与预期一样,首先调用矩形包的init
函数,然后初始化包级别变量rectLen
和rectWidth
。接下来调用主包的init
函数。它检查rectLen
和rectWidth
是否小于零,如果条件为真则终止。
两个条件都是假的,程序继续执行。最后调用主函数。
让我们稍微修改一下这个程序来学习init
函数的用法。
把代码var rectLen, rectWidth float64 = 6,7
改为var rectLen, rectWidth float64 = -6,7
。
现在,如果运行应用程序,将看到
rectangle package initialized
main package initialized
2017/04/04 00:28:20 length is less than zero
程序首先初始化矩形包,然后在主包中初始化包级别变量rectLen
和rectWidth
。rectLen
是负的,因此,当init
函数运行时,程序将终止并打印日志。