婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談golang package中init方法的多處定義及運行順序問題

淺談golang package中init方法的多處定義及運行順序問題

熱門標簽:評價高的400電話辦理 外呼系統用什么卡 阿克蘇地圖標注 外呼系統顯本地手機號 涿州代理外呼系統 壽光微信地圖標注 電話機器人軟件免費 excel地圖標注分布數據 百度地圖標注后傳給手機

在不了解這個問題之前,在網上搜索一下竟然搜出了兩個完全相反的結果,所以打算自己測試下這個問題。

首先給出結論:

在同一個package中,可以多個文件中定義init方法

在同一個go文件中,可以重復定義init方法

在同一個package中,不同文件中的init方法的執行按照文件名先后執行各個文件中的init方法

在同一個文件中的多個init方法,按照在代碼中編寫的順序依次執行不同的init方法

下面看下測試的代碼:

在當前目錄下新建main.go及testinit目錄,在testinit目錄下共有三個文件:123.go、ini1.go、ini2.go,各個源碼文件分別如下:

123.go

package testinit
import "fmt"
func init(){
    fmt.Println("123init")
}

ini1.go

package testinit
import "fmt"
func init(){
    fmt.Println("init1")
}
func init(){
    fmt.Println("init1-2")
}

ini2.go

package testinit
import "fmt"
func init(){
    fmt.Println("init2")
}

main.go

package main
import (
    _ "./testinit"
    "fmt"
)
func main(){
    fmt.Println("main")
}

如上main.go中導入testinit package,然后go build main.go,執行顯示如下:

從運行的結構就能很清晰的看到,123、ini1、ini2三個文件按照文件名執行,對于ini1.go中的兩個ini方法按照init方法編寫的先后順序執行,最后才執行的main方法!

補充:Golang中defer、return、返回值和main、init函數的陷阱

Go語言中延遲函數defer充當著 cry...catch 的重任,使用起來也非常簡便,然而在實際應用中,很多gopher并沒有真正搞明白defer、return和返回值之間的執行順序。他們的特點:

多個defer的執行順序為“后進先出”;

defer、return、返回值三者的執行邏輯應該是:return最先執行,return負責將結果寫入返回值中;接著defer開始執行一些收尾工作;最后函數攜帶當前返回值退出。

如何解釋兩種結果的不同:

上面兩段代碼的返回結果之所以不同,其實從上面第2條結論很好理解。

a()int 函數的返回值沒有被提前聲名,其值來自于其他變量的賦值,而defer中修改的也是其他變量,而非返回值本身,因此函數退出時返回值并沒有被改變。

b()(i int) 函數的返回值被提前聲名,也就意味著defer中是可以調用到真實返回值的,因此defer在return賦值返回值 i 之后,再一次地修改了 i 的值,最終函數退出后的返回值才會是defer修改過的值。

package main 
import (
 "fmt"
)
 
func main() { 
 fmt.Println("c return:", *(c())) // 打印結果為 c return: 2
 
}
 
func c() *int {
 var i int
 defer func() {
  i++
  fmt.Println("c defer2:", i) // 打印結果為 c defer: 2
 }()
 
 defer func() {
  i++
  fmt.Println("c defer1:", i) // 打印結果為 c defer: 1
 }()
 return i
}

雖然 c()*int 的返回值沒有被提前聲明,但是由于 c()*int 的返回值是指針變量,那么在return將變量 i 的地址賦給返回值后,defer再次修改了 i 在內存中的實際值,因此函數退出時返回值雖然依舊是原來的指針地址,但是其指向的內存實際值已經被成功修改了。

Go里面有兩個保留的函數:init函數(能夠應用于所有的package)和main函數(只能應用于package main)。這兩個函數在定義時不能有任何的參數和返回值。雖然一個package里面可以寫任意多個init函數,但這無論是對于可讀性還是以后的可維護性來說,我們都強烈建議用戶在一個package中每個文件只寫一個init函數。

Go程序會自動調用init()和main(),所以你不需要在任何地方調用這兩個函數。每個package中的init函數都是可選的,但package main就必須包含一個main函數。

程序的初始化和執行都起始于main包。如果main包還導入了其它的包,那么就會在編譯時將它們依次導入。有時一個包會被多個包同時導入,那么它只會被導入一次(例如很多包可能都會用到fmt包,但它只會被導入一次,因為沒有必要導入多次)。

當一個包被導入時,如果該包還導入了其它的包,那么會先將其它包導入進來,然后再對這些包中的包級常量和變量進行初始化,接著執行init函數(如果有的話),依次類推。

等所有被導入的包都加載完畢了,就會開始對main包中的包級常量和變量進行初始化,然后執行main包中的init函數(如果存在的話),最后執行main函數。

下圖詳細地解釋了整個執行過程:

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 為什么不建議在go項目中使用init()
  • go語言的初始化順序,包,變量,init詳解
  • Go語言init函數詳解
  • GO語言ini配置文件的讀取的操作

標簽:蘭州 吐魯番 欽州 雞西 銅川 重慶 梅河口 汕頭

巨人網絡通訊聲明:本文標題《淺談golang package中init方法的多處定義及運行順序問題》,本文關鍵詞  淺談,golang,package,中,init,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談golang package中init方法的多處定義及運行順序問題》相關的同類信息!
  • 本頁收集關于淺談golang package中init方法的多處定義及運行順序問題的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲欧洲av色图| 欧美制服丝袜第一页| 国产馆精品极品| 欧美成人综合网站| 日本美女一区二区三区视频| 色婷婷综合激情| 亚洲黄色小视频| 欧美在线999| 日韩电影在线一区二区| 日韩视频免费观看高清完整版 | 国产精品久久99| 成人激情开心网| 亚洲欧美偷拍另类a∨色屁股| 91热门视频在线观看| 亚洲一区免费观看| 欧美一区二区三区免费在线看| 经典三级视频一区| 国产精品超碰97尤物18| 欧美视频一区二区三区| 久久精品国产一区二区三| 欧美精品一区二区在线观看| 成人免费高清在线| 天天综合网 天天综合色| 2020国产精品自拍| 一本大道综合伊人精品热热| 久久er精品视频| 亚洲视频免费在线观看| 日韩一区和二区| 成人精品小蝌蚪| 天堂成人国产精品一区| 国产欧美日韩久久| 精品视频一区三区九区| 国产制服丝袜一区| 亚洲一卡二卡三卡四卡| 精品国产乱码久久久久久图片| 97久久久精品综合88久久| 老色鬼精品视频在线观看播放| 一区免费观看视频| 日韩一二在线观看| 色综合天天综合网天天狠天天| 美女在线视频一区| 亚洲欧美国产三级| 5月丁香婷婷综合| 成人伦理片在线| 久久精品国产77777蜜臀| 国产精品麻豆一区二区| 日韩美一区二区三区| 成人精品亚洲人成在线| 亚洲丶国产丶欧美一区二区三区| www久久精品| 欧美日韩亚洲另类| 色噜噜久久综合| 久久精品国产久精国产| 亚洲自拍与偷拍| 国产视频亚洲色图| 337p粉嫩大胆噜噜噜噜噜91av | 色综合久久久网| 国产99久久久国产精品免费看| 日韩高清在线一区| 亚洲在线视频网站| 亚洲乱码国产乱码精品精98午夜| 国产精品国产自产拍高清av王其 | 国产69精品久久久久毛片| 久国产精品韩国三级视频| 日韩福利电影在线观看| 性做久久久久久免费观看| 一区二区三区四区视频精品免费 | 日本一区二区不卡视频| 欧美不卡激情三级在线观看| 日韩手机在线导航| 精品久久人人做人人爱| 久久综合色鬼综合色| 久久久国产精华| 国产精品色呦呦| 亚洲同性同志一二三专区| 日韩理论片一区二区| 一区二区三区欧美亚洲| 亚洲第一电影网| 免费xxxx性欧美18vr| 国产一区二区看久久| 国产91富婆露脸刺激对白| 91污在线观看| 884aa四虎影成人精品一区| 日韩一区二区免费电影| 欧美不卡在线视频| 日韩美女啊v在线免费观看| 亚洲高清视频的网址| 久久69国产一区二区蜜臀| 国产一区二区在线电影| 成人国产视频在线观看| 欧美伊人久久大香线蕉综合69| 欧美日韩成人综合| 精品国产免费视频| ...中文天堂在线一区| 天使萌一区二区三区免费观看| 久久99国内精品| 91麻豆精品在线观看| 欧美一区永久视频免费观看| 国产午夜精品久久久久久久| 一区二区三区在线播放| 国产一区二区伦理| 欧美性极品少妇| 国产三级欧美三级日产三级99 | 日本欧美一区二区在线观看| 国产成人8x视频一区二区 | 欧美一区二区三区在线电影| 欧美大片日本大片免费观看| 中文字幕亚洲在| 久久激情五月激情| 91精品办公室少妇高潮对白| 久久欧美一区二区| 天天综合色天天| 成人精品亚洲人成在线| 精品国一区二区三区| 亚洲一级二级在线| www.99精品| 久久久精品综合| 欧美aaa在线| 色妹子一区二区| 国产精品无人区| 国产资源精品在线观看| 日韩一卡二卡三卡国产欧美| 亚洲精品一卡二卡| 成人精品国产一区二区4080| 亚洲精品在线三区| 麻豆国产91在线播放| 欧美日韩aaa| 午夜一区二区三区在线观看| 91视视频在线直接观看在线看网页在线看| 欧美一级黄色片| 亚洲国产精品综合小说图片区| av在线不卡免费看| 国产精品久久久久久久久晋中| 国产风韵犹存在线视精品| 精品乱人伦小说| 久久97超碰国产精品超碰| 欧美一区二区三区白人| 午夜精品久久久| 3d动漫精品啪啪| 奇米精品一区二区三区四区 | 国产欧美日韩麻豆91| 久热成人在线视频| 亚洲精品在线观看视频| 激情欧美一区二区三区在线观看| 91精品在线麻豆| 免费黄网站欧美| 欧美大片免费久久精品三p| 九色|91porny| 久久久久九九视频| 成人不卡免费av| 亚洲最大的成人av| 欧美日韩国产a| 麻豆91在线观看| 欧美经典三级视频一区二区三区| 粉嫩一区二区三区性色av| 综合亚洲深深色噜噜狠狠网站| 色哟哟一区二区| 亚洲精品美腿丝袜| 777亚洲妇女| 成人黄动漫网站免费app| 亚洲一区二区三区免费视频| 日韩欧美亚洲国产精品字幕久久久| 六月丁香综合在线视频| 欧美激情综合五月色丁香小说| 日本韩国一区二区三区| 免费成人av在线播放| 国产精品日韩成人| 欧美色精品天天在线观看视频| 久久99久久久欧美国产| 综合自拍亚洲综合图不卡区| 日韩欧美在线观看一区二区三区| 国产成人在线看| 亚洲午夜久久久| 久久久久久久网| 欧洲精品视频在线观看| 日韩高清欧美激情| 日本一区二区三区视频视频| 欧美系列在线观看| 国内精品伊人久久久久影院对白| 国产精品美女www爽爽爽| 欧美日韩精品三区| 丁香五精品蜜臀久久久久99网站| 一区二区三区美女视频| 精品剧情在线观看| 欧美精品欧美精品系列| 国产一区二三区| 日精品一区二区三区| 国产精品久久精品日日| 欧美成人aa大片| 337p亚洲精品色噜噜狠狠| 国产成人在线观看免费网站| 日本中文在线一区| 亚洲国产精品一区二区尤物区| 国产精品国产a| 久久久久久黄色| 精品国产一区二区亚洲人成毛片| 91成人看片片| 成人动漫一区二区| 国产福利一区在线| 精品中文字幕一区二区小辣椒|