当前位置: 首页 > news >正文

Go基础编程 - 03 - init函数、main函数、_(下划线)

目录

  • 1. init 函数
  • 2. main 函数
  • 3. init 函数与 main 函数异同
  • 4. _ (下划线)
  • 示例

1. init 函数

Go语言中,init 函数用于包(package)的初始化。具有以下特征:

1. init 函数用于程序执行前包的初始化,如初始化变量等。2. 每个包可拥有多个 init 函数。3. 包的每个源文件可有多个 init 函数(执行顺序有上到下)。4. 同一个包中多个 init 函数的执行顺序 Go 语言没有明确定义。5. 不同包的 init 函数按照包导入的依赖关系决定该初始化函数的执行顺序。6. init 函数不能被其它函数调用,在 main 函数执行之前自动被调用。

2. main 函数

Go语言默认入口函数(主函数)

3. init 函数与 main 函数异同

  • 相同点:均无参数和返回值,由Go程序自动调用。
  • 不同点:init 函数可以应用于任意包中,且可重复多个;main 函数只能用于 main 包,且只能定义一个。

4. _ (下划线)

"-" 是特殊标识符,用来忽略结果。

  • import 中使用
    当导入一个包时,该包下所有init()函数都会执行;如果我们并不需要把整个包导入进来,仅仅希望执行它的init()函数。就可使用下划线(_)引入该包, import _ package 仅调用了init()函数,无法调用包内其它函数。

  • 在代码中使用
    占位符(忽略变量):意思是那个位置本应赋给某个值,但咱们不需要这个值;所以就把该值赋给下划线,意思是丢掉不要,这样编译器可以更好的优化。

    这种情况就是占位用的,方法返回两个结果,而你只想要一个结果;那另一个就用 “_” 占位。而如果用变量的话,变量不使用,编译器是会报错。

    任何类型的单个值都可以丢给下划线。

示例

代码结构如下:

 src +--- main.go            +--- learn+--- mynote.go+--- hello+--- hello.go

learn/mynote.go 代码:

package learnimport ("fmt"
)func init() {fmt.Println("Exec the init func of mynote!")
}// 一个文件可以有多个init函数,同样证明一个包可以有多个init函数
func init() {fmt.Println("Second exec the init func of mynote!")
}func Note() {fmt.Println("Golang study note!")
}

hello/hello.go 代码:

package helloimport ("fmt"
)func init() {fmt.Println("Exec the init func of hello.go!")
}func SayHello() {fmt.Println("Hello, Everyone!")
}func MultiReturn() (int, string) {return 100, "一百"
}

main.go 代码:

package mainimport (_ "learn"   "hello""fmt"
)func main() {// 无法调用learn内的函数,被 _ 忽略// learn.Note()hello.SayHello()i, s := hello.MultiReturn()fmt.Printf("i=%d, s=%s \n", i, s)// _ 忽略返回变量i1, _ := hello.MultiReturn()fmt.Printf("i1=%d", i1)
}

执行 go run ./,执行整个包使用 ./

PS F:\SelfProject\Go\Learning> go run ./
Exec the init func of mynote!
Second exec the init func of mynote!
Exec the init func of hello.go!
Heollo, Everyone!
i=100, s=一百
i1=100

相关文章:

  • 练习题-17
  • Spring IoC 的实现机制
  • Linux用户权限管理小实验002
  • C++牛客周赛43题目分享(3)小红平分糖果,小红的完全平方数,小苯的字符串变化,小红的子数组排列判断
  • 【云原生】kubernetes中的认证、权限设置--RBAC授权原理分析与应用实战
  • 虚拟机Ubuntu 22.04上搭建GitLab操作步骤
  • 黑客团伙利用Python、Golang和Rust恶意软件袭击印国防部门;OpenAI揭秘,AI模型如何被用于全球虚假信息传播? | 安全周报0531
  • 《异常检测——从经典算法到深度学习》29 EasyTSAD: 用于时间序列异常检测模型的工业级基准
  • 深入分析 Android Activity (二)
  • 软考系统集成项目管理工程师第7章思维导图发布
  • 探索AI去衣技术中的反射应用
  • FreeRTOS基础(三):动态创建任务
  • 面试题:计算机网络中的七四五是什么?
  • pytorch学习笔记3
  • Vue:现代前端开发的首选框架-【高级特性篇】
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【347天】每日项目总结系列085(2018.01.18)
  • DOM的那些事
  • JavaScript 奇技淫巧
  • Java的Interrupt与线程中断
  • PHP的类修饰符与访问修饰符
  • 闭包--闭包作用之保存(一)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 前端设计模式
  • 温故知新之javascript面向对象
  • 异步
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何在招聘中考核.NET架构师
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Panda3d 碰撞检测系统介绍
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #QT(QCharts绘制曲线)
  • #微信小程序:微信小程序常见的配置传旨
  • (C++)八皇后问题
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十)T检验-第一部分
  • (算法二)滑动窗口
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) 深度模型优化性能 调参
  • (转)重识new
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .Net - 类的介绍
  • .NET 发展历程
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .pyc文件是什么?
  • @property @synthesize @dynamic 及相关属性作用探究
  • @RequestMapping处理请求异常
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [AIGC 大数据基础]hive浅谈
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++打怪升级]--学习总目录
  • [CakePHP] 在Controller中使用Helper