婷婷综合国产,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
    亚洲最大成人网4388xx| 色成人在线视频| 欧美日韩成人高清| 国产美女在线观看一区| 亚洲成人中文在线| 1区2区3区欧美| 久久综合九色综合欧美就去吻| 欧美亚洲一区二区三区四区| 国产成人一区在线| 免费成人性网站| 亚洲精品日韩一| 中文乱码免费一区二区| 久久夜色精品国产噜噜av| 欧美久久久一区| 欧美视频精品在线| 在线精品观看国产| 色婷婷综合久久久久中文| 国产乱码精品一区二区三区av| 天天综合天天做天天综合| 亚洲精品久久久蜜桃| 国产精品高潮呻吟| 国产精品乱码一区二区三区软件| 久久久精品蜜桃| 欧美国产日产图区| 中文字幕国产精品一区二区| 日本一区二区动态图| 91麻豆精品久久久久蜜臀| 欧美日韩不卡在线| 91精品国产aⅴ一区二区| 欧美一卡在线观看| 欧美一级专区免费大片| 欧美一区二区三区日韩| 国产欧美日韩综合| 亚洲精品精品亚洲| 亚洲成人av免费| 午夜激情一区二区三区| 午夜精品久久久久久久久| 日韩av网站在线观看| 国内久久精品视频| www.久久精品| 欧美亚洲国产怡红院影院| 欧美成人r级一区二区三区| 久久这里只精品最新地址| 国产精品―色哟哟| 一区二区三区视频在线看| 日本精品一级二级| 日韩久久精品一区| 国产免费成人在线视频| 国产精品视频你懂的| 怡红院av一区二区三区| 青青草国产成人av片免费| 久久99九九99精品| 成人激情电影免费在线观看| 色琪琪一区二区三区亚洲区| 欧美videos中文字幕| 国产精品蜜臀在线观看| 午夜视频在线观看一区| 久久精品国产亚洲一区二区三区| 不卡av电影在线播放| 91精品国产入口| 中文字幕一区av| 久久电影网电视剧免费观看| 91免费在线视频观看| 精品久久久久久最新网址| 亚洲激情第一区| 国产精品99精品久久免费| 欧美精品成人一区二区三区四区| 日本一区二区成人| 日本不卡一区二区| 99re8在线精品视频免费播放| 日韩一区二区免费电影| 亚洲精选在线视频| 成人av网站在线| 国产亚洲精品超碰| 蜜臀av一区二区在线观看| 欧美日韩精品系列| 伊人婷婷欧美激情| av在线不卡免费看| 国产欧美综合在线| 国内精品在线播放| 久久综合九色综合欧美就去吻| 全国精品久久少妇| 欧美日韩一区精品| 亚洲女同一区二区| 91视频在线看| 日韩美女视频一区| 日韩三级视频中文字幕| 洋洋成人永久网站入口| 成人动漫一区二区在线| 欧美成人激情免费网| 视频一区欧美精品| 91丨porny丨首页| 中文字幕一区二区视频| 激情小说亚洲一区| 欧美va亚洲va在线观看蝴蝶网| 日韩精品电影一区亚洲| 欧美久久免费观看| 亚洲天堂av老司机| 成人三级在线视频| 欧美日韩久久久久久| 国产精品成人网| av成人老司机| 国产精品久久夜| 大胆欧美人体老妇| 国产成人综合自拍| 中文字幕成人网| 成人福利视频网站| www欧美成人18+| 男男gaygay亚洲| 欧美精品少妇一区二区三区| 日韩高清一级片| 欧美日韩国产系列| 亚洲美女视频一区| 成人免费毛片片v| 国产午夜精品一区二区| jiyouzz国产精品久久| 国产亚洲欧美激情| 国产麻豆成人传媒免费观看| 精品乱码亚洲一区二区不卡| 免费精品99久久国产综合精品| 久久久久一区二区三区四区| 国内成人自拍视频| 久久精品免费在线观看| 狠狠网亚洲精品| 精品国产乱码久久久久久蜜臀 | 欧美一区二区三区免费| 亚洲精品少妇30p| 日本韩国欧美三级| 亚洲欧美日韩电影| 一本大道av伊人久久综合| 日本欧美一区二区三区乱码| 欧美精品xxxxbbbb| 久久99精品国产91久久来源| 精品奇米国产一区二区三区| 国产精品一区二区三区四区| 国产视频一区二区在线| 日韩va欧美va亚洲va久久| 欧美精品久久一区| 久久久综合视频| 蜜臀av在线播放一区二区三区| av一二三不卡影片| 亚洲精品第1页| 欧美在线你懂得| 日本成人中文字幕在线视频| 欧美v日韩v国产v| 成人性生交大片免费看视频在线| 亚洲国产高清在线观看视频| av一二三不卡影片| 亚洲第一福利一区| 久久婷婷综合激情| 99热国产精品| 亚洲欧美区自拍先锋| 精品久久久久久无| 日本精品一级二级| 国产一区二区在线电影| 中文字幕日本乱码精品影院| 日韩精品电影在线观看| 久久精品一区二区三区不卡牛牛 | 精品视频在线免费看| 国产不卡视频一区| 午夜欧美电影在线观看| 成人欧美一区二区三区小说 | 欧美日韩一区二区三区在线| 青青草成人在线观看| 国产精品麻豆网站| 91国产成人在线| av电影在线不卡| 久久精品国产免费看久久精品| 国产欧美日韩综合| 日韩三级电影网址| 欧美久久婷婷综合色| 91视频国产观看| 暴力调教一区二区三区| 久久精品国产77777蜜臀| 免费精品视频最新在线| 一二三区精品视频| 一区二区三区不卡视频在线观看| 欧美性视频一区二区三区| 97久久超碰国产精品电影| 波多野结衣中文字幕一区二区三区| 首页国产欧美日韩丝袜| 乱中年女人伦av一区二区| 亚洲自拍偷拍综合| 性久久久久久久久| 亚洲欧美日韩国产另类专区| 国产精品91xxx| 日韩精品午夜视频| 9色porny自拍视频一区二区| 国内精品视频一区二区三区八戒| 国产一区二区在线免费观看| 成人a免费在线看| 欧美伊人精品成人久久综合97| 99久久伊人网影院| 欧美一卡二卡在线| 亚洲摸摸操操av| 国产91精品一区二区麻豆亚洲| 日韩和欧美的一区| 欧美片网站yy| 亚洲成va人在线观看| 国产一区二区三区精品视频|