go语言的init函数详解


本文摘自php中文网,作者尚,侵删。

go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性,

有下面的特征:

1 init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等

2 每个包可以拥有多个init函数

3 包的每个源文件也可以拥有多个init函数

4 同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)

5 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序

6 init函数不能被其他函数调用,而是在main函数执行之前,自动被调用

下面这个示例摘自《the way to go》,os差异在应用程序初始化时被隐藏掉了,

1

2

3

4

5

6

7

8

9

var prompt = "Enter a digit, e.g. 3 " + "or %s to quit."

 

func init() {

    if runtime.GOOS == "Windows" {

        prompt = fmt.Sprintf(prompt, "Ctrl+Z, Enter")

    } else { // Unix-like

        prompt = fmt.Sprintf(prompt, "Ctrl+D")

    }

}

下面的两个go文件演示了:

1 一个package或者是go文件可以包含多个init函数,

2 init函数是在main函数之前执行的,

3 init函数被自动调用,不能在其他函数中调用,显式调用会报该函数未定义

gprog.go代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package main

 

import (

    "fmt"

)

 

// the other init function in this go source file

func init() {

    fmt.Println("do in init")

}

 

func main() {

    fmt.Println("do in main")

}

 

func testf() {

    fmt.Println("do in testf")

    //if uncomment the next statment, then go build give error message : .\gprog.go:19: undefined: init

    //init()

}

ginit1.go代码,注意这个源文件中有两个init函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

package main

 

import (

    "fmt"

)

 

// the first init function in this go source file

func init() {

    fmt.Println("do in init1")

}

 

// the second init function in this go source file

func init() {

    fmt.Println("do in init2")

}

编译上面两个文件:go build gprog.go ginit1.go

阅读剩余部分

相关阅读 >>

Go语言指针作为函数参数

Go语言有引用传递么

Go语言程序如何编译

Go语言中数组和切片的区别是什么?

什么是Go语言Go语言的优缺点介绍

Go语言异常处理的方法介绍

Go语言中处理json数据的方法

Go语言 for 循环

go在谷歌:以软件工程为目的的语言设计

Go语言属于什么

更多相关阅读请进入《Go语言》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...