Go語言的執行順序(轉)

来源:https://www.cnblogs.com/lxx-coder/archive/2020/06/09/13081517.html
-Advertisement-
Play Games

在一個 go 程式中通常包含:包、常量、變數、init()、main()等元素,如果同時存在多個包,包之間存在依賴關係,每個包中存在多個 init 函數,每個文件中存在多個 init 函數。 包的執行順序 在 main 包中的 go 文件預設總是會被執行 同包下的不同 go 文件,按照文件名“從小到 ...


在一個 go 程式中通常包含:包、常量、變數、init()、main()等元素,如果同時存在多個包,包之間存在依賴關係,每個包中存在多個 init 函數,每個文件中存在多個 init 函數。

包的執行順序

  • 在 main 包中的 go 文件預設總是會被執行
  • 同包下的不同 go 文件,按照文件名“從小到大”排序順序執行
  • 其他的包只有被 main 包 import 才會執行,按照 import 的先後順序執行
  • 被遞歸 import 的包的初始化順序與 import 順序相反,例如:導入順序 main –> A –> B –> C,則初始化順序為 C –> B –> A –> main
  • 一個包被其它多個包 import,但只能被初始化一次
  • main 包總是被最後一個初始化,因為它總是依賴別的包
  • 避免出現迴圈 import,例如:A –> B –> C –> A

go 程式的初始化順序見下圖:

init 和 main 函數

init()、main() 是 go 語言中的保留函數,兩個函數在 go 語言中的區別如下: 
相同點:

  • 兩個函數在定義時不能有任何的參數和返回值
  • 該函數只能由 go 程式自動調用,不可以被引用

不同點:

  • init 可以應用於任意包中,且可以重覆定義多個。
  • main 函數只能用於 main 包中,且只能定義一個。

兩個函數的執行順序:

  • 對同一個 go 文件的 init( ) 調用順序是從上到下的
  • 對同一個 package 中的不同文件,將文件名按字元串進行“從小到大”排序,之後順序調用各文件中的init()函數
  • 對於不同的 package,如果不相互依賴的話,按照 main 包中 import 的順序調用其包中的 init() 函數
  • 如果 package 存在依賴,調用順序為最後被依賴的最先被初始化,例如:導入順序 main –> A –> B –> C,則初始化順序為 C –> B –> A –> main,一次執行對應的 init 方法。

常量、變數、init()、main()

在同一個文件中,常量、變數、init()、main() 依次進行初始化。

init 順序

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

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

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

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

5、對於不同的 package,如果不相互依賴的話,按照 main 包中 import 的順序調用其包中的 init() 函數

6、如果 package 存在依賴,調用順序為最後被依賴的最先被初始化,例如:導入順序 main –> A –> B –> C,則初始化順序為 C –> B –> A –> main,一次執行對應的 init 方法。

所有 init 函數都在同⼀個 goroutine 內執⾏。 
所有 init 函數結束後才會執⾏ main.main 函數。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.1什麼是數據結構? 官方解釋: 數據結構是一門研究非數值計算的程式設計問題中的操作對象,以及他們之間的關係和操作等相關問題的學科。 大白話 : 數據結構就是把數據元素按照一定的關係組織起來的集合,用來組織和存儲數據 1.2數據結構分類? 傳統上。我們可以把數據結構分為邏輯結構和物理結構兩大類。 ...
  • 1.前言 這應該是本學期最後一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得瞭如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業過程總結 相比前兩個單元,此單 ...
  • 特別註意:本代碼為 Springboot 工作流 前後分離 + 跨域 版本 (許可權控制到菜單和按鈕) 後臺框架:springboot2.3.0+ Flowable6.5.0+ mybaits+maven+介面 前端頁面:html +vue.js 形式 jquery ajax 非同步跨域 json 格式 ...
  • 對MVC、MVP、MVVM的理解(一) 一、MVC MVC模式再網上的爭議是最大的,一些博客中是這樣描述的 MVC模式的通信是單向的,View觸發事件或數據的提交,到了Controller進行處理邏輯之後,返回Model給View,View再從Model中取出數據,當然View中也會有相應的邏輯。個 ...
  • 一、雜論 1.電腦的存儲方式可以分為兩大基本類型:整數類型和浮點類型。 2.C語言中的數據類型關鍵字: int\long\short\unsigned\char\float\double\signed\void\__Bool\__Complex\__Imaginary 3. 1位元組(byte) = ...
  • Django中模板的用法簡介 1. 模板系統的介紹 Django作為一個Web框架,其模板所需的HTML輸出靜態部分以及動態內容插入 模板由HTML代碼和邏輯控制代碼構成 Django框架的模板語言的語法格式: {{var_name}} 例如:HTML被直接編碼在python代碼中: import ...
  • 學習生成器之前,首先需要認識列表生成式,直奔主題。 1、簡單列表生成式示例: 1 b = [ i for i in range(10)] 2 print(b) 3 4 >>> 5 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 看樣子好像很NB的樣子,其實它等價於: 1 c = [] ...
  • ​ 現如今每個公司都有自己的大數據平臺和大數據團隊,可以看出大數據建設在公司的重要地位,不管是用於做數據分析、BI還是做用於機器學習、人工智慧等領域,大數據都是基礎,海量數據成為了互聯網公司的重要資產。 今天這一份書單,我們將推薦幾本綜合介紹大數據平臺和技術棧的優質書籍,幫各位對大數據技術感興趣的小 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...