Golang特殊init函数的实现实例
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">介绍</a></li><li><a href="#_label1">使用</a></li><li><a href="#_label2">场景</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>介绍</h2><p>init()函数是一个特殊的函数,存在一下特性</p>
<ul><li>不能被其它函数调用,而是子main()函数之前自动调用</li><li>不能作为参数传入</li><li>不能有传入参数和返回值</li></ul>
<p>作用:</p>
<ul><li>对变量进行初始化</li><li>检查/修复程序状态</li><li>注册</li><li>运行一次计算</li></ul>
<p>以下是<<the way to go>>的解释:</p>
<blockquote><p>变量除了可以在全局声明中初始化,也可以在 init ()函数中初始化。这是一类非常特殊的函数,它不能够被人为调用,而是在每个包完成初始化后自动执行,并且执行优先级比 main 函数高。</p>
<p>每个源文件都只能包含一个 init() 函数(此处存在错误)。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。</p></blockquote>
<p class="maodian"><a name="_label1"></a></p><h2>使用</h2>
<ul><li>每个源文件都可以包含多个init()函数</li></ul>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025112011311187.png" /></p>
<ul><li>导入包的顺序决定了init函数的执行顺序</li></ul>
<p>go中不同包中init函数的执行顺序是根据包的导入关系决定。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025112011311112.png" /></p>
<p> init函数调用关系:图片来源网络</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025112011311116.png" /></p>
<p class="maodian"><a name="_label2"></a></p><h2>场景</h2>
<ul><li><p>对变量进行初始化</p></li></ul>
<div class="jb51code"><pre class="brush:go;">package main
import (
"math"
)
var pi float64
func init() {
pi = 4 * math.Atan(1)
}</pre></div>
<ul><li>在程序开始前,调用后台执行goroutine</li></ul>
<div class="jb51code"><pre class="brush:go;">package main
func init() {
go backend()
}</pre></div>
<ul><li>连接数据库</li></ul>
<div class="jb51code"><pre class="brush:go;">package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
var Db *sqlx.DB
func init() {
database, err := sqlx.Open("mysql", "root:xxx@tcp(127.0.0.1:3306)/test")
if err != nil {
fmt.Println("open mysql fail", err)
return
}
Db = database
}</pre></div>
頁:
[1]