init 函数 | 学习笔记

简介: 快速学习 init 函数

开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: init 函数】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/625/detail/9605


init 函数

基本内容

一、 基本介绍

二、 案例说明

三、 init 函数的注意事项和细节

 

一、基本介绍

每一个源文件都可以包含一个 init 函数,该函数会在 main 函数执行前,被 Go 运行框架调用,也就是说 init 会在 main 函数前被调用。init 就是初始化的意思, init 函数经常被用来做初始化处理。

 

二、案例说明

package main

import(

"fmt"

)

// init 函数,通常可以在 init 函数中完成初始化工作

func init ()  {

fmt.Print1n( "init()...")

}

func main()  {

fmt.Print1n( "main()...")

}

1、 输出的结果是:

D:\goproject\src\go_code\chapter06\funcinit>go main.go

init()…

main()…

2、代码解析:

写一个主函数 fmt.Println( "main()..."), 再写一个 init 函数,当执行这段代码时,判断是 init 函数先执行还是主函数,最后先执行的 init 函数,从运行的结果看,init 函数是在 main 函数之前调用,通常可以在 init 函数中完成初始化工作。

 

三、init 函数的注意事项和细节

1.如果一个文件同时包含全局变量定义,init 函数和 main 函数,则执行的流程全局变量定义 ->init 函数 ->main 函数

package main

import (

"fmt"

)

var age = test()

//为了看到全局变量是先被初始化的,我们这里先写函数

func test() {

fmt.Println( "test()") //1

return 90

}

// init 函数,通常可以在 init 函数中完成初始化工作

func init(){

fmt.Println( "init()...") //2

}

func main() {

fmt.Println( "main()...age=", age)/ /3

}

(1) 代码解析:

写一个变量定义 var age=test() 为了看到全局变量是先被初始化的,先写一个函数来完成初始化,test() 先被输出,再是 init(),最后是 main() ,把 age 打印出来,输出 age 等于 90。输出结果 test 函数第一个执行,init 函数第二个执行,最后执行 main 函数,age=90。说明 go 程序的源文件中先执行变量定义,再执行 init,最后 main 函数。

D:\goproject\src\go_code\chapter06\funcinit>go run main.go

test()

init()…

main()…age = 90

2.init 函数最主要的作用,就是完成一些初始化工作,比如下面的案例

package main

import (

"fmt"

//引入包

"go_code/chaptere6/funcinit/utils"

)

var age = test()

//为了看到全局变量是先被初始化的,我们这里先写函数

func test() int {

fmt.Println( "test()")//1

return 90

}

// init 函数,通常可以在 init 函数中完成初始化工作

func init() {

fmt.Println("init()...") //2

}

func main() {

fmt.Println( "main()...age=", age)//3

fmt.Println( "Age=", utils.Age,"Name=", utils.Name)

}

utils.go 的代码:

package utils

import”fmt”

var Age int

var Name string

// Age 和 Name 全局变量,我们需要在 main.go 使用

// 但是我们需要初始化 Age 和 Name

// init 函数完成初始化工作

func init() {

fmt.Println(“utils 包的 init()...”)

Age = 100

Name = "tom~"

}

(1) 运行结果为:

utils 包的 init()…

test()

init()…

main()…agr = 90

Age = 100 Name = tom~

(2) 结果分析:

main.go 中要用到另一个包的文件 utils.go,全局变量 Age 和 Name ,这两个变量需要在 main.go 中使用,但使用之前需要初始化,让 init 函数完成初始化工作,在 main.go 中使用需要先引入包 "go_code/chaptere6/funcinit/utils", 在引入的时候 utils.Age 和 utils.Name 在引入之前已经被初始化了。在执行代码的时候在引入包的过程或在调用包时已经被初始化了,结果可以看到最先执行的是 utils 包的 init() ,也就是说被引入的包里的 utils.go 最先执行。

3.面试题:案例如果 main.go 和 utils.go 都含有变量定义,init 函数时,执行的流程又是怎么样的。

解:如果 main.go 引入了 utils.go 文件,先执行被引入文件中的变量定义,然后执行被引入文件中的 init 函数。再执行 main.go 中的变量定义,再执行 untils.go中的 init 函数,依次是 main.go 中的变量定义 ->init 函数 ->main 函数。

如果 utils.go 也引入了别的文件,先执行别的文件中的变量定义 ->init 函数。

image.png

相关文章
|
1月前
|
Python
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
17 1
|
2月前
|
Rust 编译器 C++
使用 def、cdef、cpdef 创建函数
使用 def、cdef、cpdef 创建函数
34 0
QuinoxlessFramework.init()
QuinoxlessFramework.init()
134 1
|
6月前
|
Python
魔法方法__init__
魔法方法__init__
|
6月前
|
C# 数据安全/隐私保护 开发者
C# 9.0中的Init关键字:Init-only Setters的新篇章
【1月更文挑战第12天】本文介绍了C# 9.0中引入的Init关键字,该关键字允许创建仅在对象初始化时可设置属性的setter。通过Init-only setters,开发者能够更加灵活地控制对象属性的赋值时机,提高代码的可维护性和安全性。文章详细解释了Init关键字的使用方法、适用场景以及与传统setter的区别,并探讨了其在实际开发中的潜在影响。
|
Python
python 中__init__ ,__new__ ,__call__,__del__ 方法
python 中__init__ ,__new__ ,__call__,__del__ 方法
169 0
|
Go 测试技术
init函数与main函数
init函数与main函数
105 0
init函数与main函数
|
C++ Python
python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,,,参数n)区别
python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,,,参数n)区别
167 0
|
Java Python
Python:对象的生命周期new-init-call-del
Python:对象的生命周期new-init-call-del
75 0
|
开发者 Python
类的特殊方法 init |学习笔记
快速学习 类的特殊方法 init
115 0