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

相关文章
|
3月前
|
监控 算法 API
亚马逊商品列表API开发指南
亚马逊商品列表API助力开发者批量获取商品数据,支持市场分析、竞品监控与推荐系统。涵盖商品信息、价格、库存等,提供Python调用示例,快速接入。
|
vr&ar 图形学
PICO4开发实战一:节奏光剑(VR)(需求文档)
这篇文章是PICO4开发实战指南,详细介绍了开发一款名为“节奏光剑”的VR游戏的需求文档,包括从基础功能开发到交互体验优化、场景体验优化、UI设计、游戏关卡设计等多个开发阶段的详细规划和说明。
PICO4开发实战一:节奏光剑(VR)(需求文档)
|
Linux iOS开发 异构计算
Ollama完成本地模型的运行
# Ollama完成本地模型的运行
3902 7
Ollama完成本地模型的运行
|
测试技术 持续交付 开发工具
掌握 Git 钩子:提升代码质量和团队协作效率
在软件开发中,保证代码质量和团队协作至关重要。Git 钩子通过在特定操作(如提交、推送)时自动执行脚本,增强了代码审查、自动化测试和持续集成。常见钩子类型包括 `pre-commit`、`post-commit`、`pre-push` 和 `post-receive`。通过配置这些钩子,开发者可以实现代码风格检查、自动化测试和自动部署等任务,从而提升代码质量和团队协作效率。例如,`pre-commit` 钩子可用于运行 ESLint 检查 JavaScript 代码风格,确保每次提交都符合编码规范。
|
弹性计算 缓存 安全
阿里云服务器2核4G配置租用费用和ECS实例规格性能参数表
阿里云 2核4GB ECS实例提供多样规格,如突发性能t6、经济型e、计算型c7/c6/c8i/c8a/c7a、通用算力型u1等,价格从68元/月至203元/月不等。通用算力u1与经济型e实例分别采用Intel Xeon 8163/8269CY与可扩展系列处理器,支持1万IOPS与最高25万连接数。2核4GB服务器支持约20人同时在线访问,实际并发数受软件效率、带宽、应用架构等因素影响。
|
Linux 开发工具 C语言
windows下安装,配置gcc编译器
在Windows下使用gcc编译器: 1.首先介绍下MinGW   MinGW是指只用自由软件来生成纯粹的Win32可执行文件的编译环境,它是Minimalist GNU on Windows的略称。
2753 0
|
消息中间件 存储 Java
Kafka 详解:全面解析分布式流处理平台
Kafka 详解:全面解析分布式流处理平台
904 0
|
存储 Kubernetes 容灾
Velero 系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践
Velero 系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践
|
Linux
linux线程私有数据详解
linux线程私有数据详解
258 0
|
C语言
万字超全详解:二叉树的基本操作(C语言版本)(上)
万字超全详解:二叉树的基本操作(C语言版本)(上)
万字超全详解:二叉树的基本操作(C语言版本)(上)