当前位置: 首页 > 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
http://www.lryc.cn/news/359314.html

相关文章:

  • 【TensorFlow深度学习】LeNet-5卷积神经网络实战分析
  • 错误发生在尝试创建一个基于有限元方法的功能空间时
  • 【八股】Hibernate和JPA:理解它们的关系
  • C++类型参数技术以及常见的类型擦除容器
  • SpringBoot如何缓存方法返回值?
  • C#的web项目ASP.NET
  • Spring MVC 源码分析之 DispatcherServlet#getHandlerAdapter 方法
  • 假设检验学习笔记
  • vue3 watch学习
  • 推荐的Pytest插件
  • C语言 | Leetcode C语言题解之第124题二叉树中的最大路径和
  • Linux综合实践(Ubuntu)
  • C++面试题其二
  • 系统架构设计师【第9章】: 软件可靠性基础知识 (核心总结)
  • x264 参考帧管理原理:i_poc_type 变量
  • 高级Web Lab2
  • Linux网络-使用Tcp协议进行网络通信并通过网络接口实现远端翻译
  • 实时数据传输:Django 与 MQTT 的完美结合
  • 创建Django项目及应用
  • Flutter课程分享 -(系统课程 基础 -> 进阶 -> 实战 仿京东商城)
  • IDEA 中导入脚手架后该如何处理?
  • thinkphp6 queue队列的maxTries自定义
  • 【PHP项目实战训练】——laravel框架的实战项目中可以做模板的增删查改功能(2)
  • Kotlin 对象
  • 力扣 142题 环形链表Ⅱ 记录
  • 乐观锁 or 悲观锁 你怎么选?
  • 《庆余年算法番外篇》:范闲通过最短路径算法在阻止黑骑截杀林相
  • 大一C语言课设 服装销售系统 代码实现与项目总结
  • 从新手到专家:深入探索JVM垃圾回收--开端篇
  • R可视化:另类的柱状图