Go 快速入门指南 - init 函数

概述

init() 函数 是一个特殊的函数,一般称为初始化函数,不能被调用。 在每个文件里面,当程序启动或者文件被作为包引用的时候,
init() 函数就会自动执行,一般用来做一些包的初始化操作。

语法规则

init() 函数 没有参数,也没有返回值。

func init() {
    // do something
}

执行顺序

包的初始化函数按照程序中引入的顺序执行,依赖于具体的顺序优先级,每次初始化一个包。
例如 包 a 引入了 包 b, 那么确保 包 b 的初始化操作 在 包 a 的初始化操作之前完成。
初始化过程是自下而上的,main 包 最后初始化,也就是说,在 main 函数 执行前,
所引用到的包已经全部初始化完成。

import -> const -> var -> init() -> main()

例子

包变量初始化

package main

import "fmt"

var (
    pageIndex int
    pageSize  int
)

func init() {
    pageIndex = 1
    pageSize = 20
}

func main() {
    fmt.Printf("page index = %d\n", pageIndex)
    fmt.Printf("page size = %d\n", pageSize)
}

// $ go run main.go
// 输出如下 
/**
  page index = 1
  page size = 20
*/

多个包之间引用初始化顺序

新建一个目录 A, 并将如下代码写入 A/a.go 文件

// 定义包 A
package A

func init() {
    println("hello A")
}

新建一个目录 B, 并将如下代码写入 B/b.go 文件

// 定义包 B
package B

import "A" // 包 B 引用包 A

func init() {
    println("hello B")
}

将如下代码写入 main.go 文件

package main

import "B" // 包 main 引用包 B

func init() {
    println("hello main")
}

func main() {
    println("hello world")
}

// $ go run main.go
// 输出如下 
/**
  hello A
  hello B
  hello main
  hello world
*/

reference

  1. https://book.douban.com/subje...

联系我

0 条评论
请不要发布违法违规有害信息,如发现请及时举报或反馈
还没有人评论呢,速度抢占沙发!
相关文章
  • TCP协议为传输控制协议,TCP协议有以下几个特点:1. TCP是面向连接的传输层协议;2. 每条TCP连接只能有两个端点,每条TCP连接是点到点的通信;3. TCP提供可靠的交付服务,保证传送的数据...

  • golang使用JWX进行认证和加密 最近看了一个名为go-auth的库,它将JWT作为HTTP cookie对用户进行验证,但这个例子中缺少了对JWT的保护,由此进行了一些针对JWX的研究。 下面描...

  • 一 获取QQ邮箱Pass 1.登录QQ邮箱 2.点击设置,点击账户,下拉找到POP3/SMTP,点击生成授权码 3.这样就获取了授权码,要妥善保管。 二 安装gomail go ge...

  • 概述select 类似 switch, 包含一系列逻辑分支和一个可选的默认分支。每一个分支对应通道上的一次操作 (发送或接收),可以将 select 理解为专门针对通道操作的 switch 语句。语法...

  • 概述在大多数处理浮点数的场景中,为了提高可读性,往往只需要精确到 2 位或 3 位,一般来说,常用的方法有两种。fmt.Sprintf()package main import "fmt" fun...

  • 这本书是写什么的? 这是一本 Go 语言快速入门手册,目标读者是有任一编程语言基础,希望以最快的时间 (比如一个周末) 入门 Go 语言。 这本书应该怎么读? 书中几乎没有较长篇幅的理论知识,更多的是...

  • crony - 分布式定时任务管理平台 1. 基本介绍 1.1 项目背景 项目中存在许多定时任务,很多代码写法都是采取见缝插针式的写法或者直接丢到task服务里面写,存在以下问题 服...

  • 在 Go 编程语言中,数据类型用于声明函数和变量。 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。 Go 语言按类别有以下几种...

  • go build 命令好处 我开发了一套在线客服系统源码,使用了go build进行编译 在我的在线客服系统使用 go build 命令的主要好处是,它可以将 Go 程序编译成可执行文件,这样就可以将...

  • 概述结构体 是将零个或多个字段 (变量) 组合在一起的复合数据类型,类似于面向对象语言中的 对象。结构体以及其字段都使用 可见性 规则。语法规则type 结构体名称 struct { 字段1名称 ...

  • 一、执行性能 缩短API的响应时长,解决批量请求访问超时的问题。在Uwork的业务场景下,一次API批量请求,往往会涉及对另外接口服务的多次调用,而在之前的PHP实现模式下,要做到并行调用是非常困难的...

  • 获取微信昵称、头像、OpenID 微信公众号服务号的网页授权功能开发,主要是通过js跳转到一个微信提供的url 然后微信会弹出获取昵称头像的按钮 允许获取后,会回跳到我们的网址上,并且带着一个code...

  • 基于Go/Grpc/kubernetes/Istio开发微服务的最佳实践尝试 - 1/3 基于Go/Grpc/kubernetes/Istio开发微服务的最佳实践尝试 - 2/3 基于Go/Grpc/...

  • 关于 Goravel Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。框架风格与 Laravel 保持一致,让...

  • 一 导包 import ( micro2 "account/common/micro" "account/config/logger" "account/config/mysql" ...

  • 概述调用 os 包即可。例子检测文件是否存在package main import ( "fmt" "os" ) func main() { if _, err := os...

  • 前面几篇文章,给大家总结了一些关于Golang中不错的开源框架、开源库等相关的内容。今天接着给分享一些不错的学习资源内容。同时也会分享一些优质的教学视频、高质量的电子书籍。想获取该文档、视频,可以通过...

  • 写在前面这篇文章与笔者之前所写几篇不同,是一篇偏综述型的文章,希望从 GC 的原理、在 Golang 中的应用、以及如何去做优化,这三个视角逐次进行阐述,文章中对于一些技术点会引用到多篇文章,希望读者...

  • 正文: 假如同事已经写了一个 CheckWebsites 的函数检查 URL 列表的状态。 package concurrency type WebsiteChecker func(string)...

  • 持续更新 Go 语言学习进度中 ...... GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblog...