go语言 – 包初始化函数

包里面可以包含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所做的更改

  • rectLenrectWidth变量从主函数级别移动到包级别。
  • 添加了init函数。init函数调用了log.Fatal函数,如果rectLen或rectWidth小于0,则将终止程序执行并打印日志。

主包的初始化顺序是

  • 导入的包首先被初始化。因此,首先初始化矩形包。
  • 包级别变量rectLenrectWidth将被初始化。
  • 调用init函数。
  • 最后调用主函数。

如果运行该程序,将得到以下输出。

rectangle package initialized  
main package initialized  
Geometrical shape properties  
area of rectangle 42.00  
diagonal of the rectangle 9.22  

与预期一样,首先调用矩形包的init函数,然后初始化包级别变量rectLenrectWidth。接下来调用主包的init函数。它检查rectLenrectWidth是否小于零,如果条件为真则终止。

两个条件都是假的,程序继续执行。最后调用主函数。

让我们稍微修改一下这个程序来学习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  

程序首先初始化矩形包,然后在主包中初始化包级别变量rectLenrectWidthrectLen是负的,因此,当init函数运行时,程序将终止并打印日志。



浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载