《Go 語言第一課》課程學習筆記(五)

入口函數與包初始化:搞清 Go 程序的執行次序

main.main 函數:Go 應用的入口函數

  • Go 語言中有一個特殊的函數:main 包中的 main 函數,也就是 main.main,它是所有 Go 可執行程序的用戶層執行邏輯的入口函數。
    • Go 程序在用戶層面的執行邏輯,會在這個函數內按照它的調用順序展開。
    • main 函數的函數原型非常簡單,沒有參數也沒有返回值。
    • Go 語言要求:可執行程序的 main 包必須定義 main 函數,否則 Go 編譯器會報錯。在啟動了多個 Goroutine 的 Go 應用中,main.main 函數將在 Go 應用的主 Goroutine 中執行。
    • 不過對于 main 包的 main 函數來說,還需要明確一點,就是它雖然是用戶層邏輯的入口函數,但它卻不一定是用戶層第一個被執行的函數。

init 函數:Go 包的初始化函數

  • Go 語言還有一個特殊函數,它就是用于進行包初始化的 init 函數了。和 main.main 函數一樣,init 函數也是一個無參數無返回值的函數。
  • 如果 main 包依賴的包中定義了 init 函數,或者是 main 包自身定義了 init 函數,那么 Go 程序在這個包初始化的時候,就會自動調用它的 init 函數,因此這些 init 函數的執行就都會發生在 main 函數之前。
    • 在初始化 Go 包時,Go 會按照一定的次序,逐一、順序地調用這個包的 init 函數。
    • 一般來說,先傳遞給 Go 編譯器的源文件中的 init 函數,會先被執行;而同一個源文件中的多個 init 函數,會按聲明順序依次執行。
    • 當我們要在 main.main 函數執行之前,執行一些函數或語句的時候,我們只需要將它放入 init 函數中就可以了。

Go 包的初始化次序

  • Go 包是程序邏輯封裝的基本單元,每個包都可以理解為是一個“自治”的、封裝良好的、對外部暴露有限接口的基本單元。
    • 一個 Go 程序就是由一組包組成的,程序的初始化就是這些包的初始化。
    • 每個 Go 包還會有自己的依賴包、常量、變量、init 函數(其中 main 包有 main 函數)等。
    • 我們在閱讀和理解代碼的時候,需要知道這些元素在在程序初始化過程中的初始化順序,這樣便于我們確定在某一行代碼處這些元素的當前狀態。
  • Go 在進行包初始化的過程中,會采用“深度優先”的原則,遞歸初始化各個包的依賴包。
  • Go 會按照“常量 -> 變量 -> init 函數”的順序進行初始化,執行完這些初始化工作后才正式進入程序的函數。包內的多個 init 函數按出現次序進行自動調用。

init 函數的用途

  • init 函數的第一個常用用途:重置包級變量值。init 函數就好比 Go 包真正投入使用之前唯一的“質檢員”,負責對包內部以及暴露到外部的包級數據(主要是包級變量)的初始狀態進行檢查。
  • init 函數的第二個常用用途,是實現對包級變量的復雜初始化。
  • init 函數的第三個常用用途:在 init 函數中實現“注冊模式”。通過在 init 函數中注冊自己的實現的模式,就有效降低了 Go 包對外的直接暴露。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一起創建Vue腳手架吧

目錄 一、安裝Vue CLI1.1 配置 npm 淘寶鏡像1.2 全局安裝1.3 驗證是否成功 二、創建vue_test項目2.1 cmd進入桌面2.2 創建項目2.3 運行項目2.4 查看效果 三、腳手架結構分析3.1 文件目錄結構分析3.2 vscode終端打開項目 一、安裝Vue CLI CLI:command-line interface…

日常BUG——微信小程序提交代碼報錯

😜作 者:是江迪呀??本文關鍵詞:日常BUG、BUG、問題分析??每日 一言 :存在錯誤說明你在進步! 一、問題描述 在使用微信小程序開發工具進行提交代碼時,報出如下錯誤: Invalid a…

Git提交規范指南

在開發過程中,Git每次提交代碼,都需要寫Commit message(提交說明),規范的Commit message有很多好處: 方便快速瀏覽查找,回溯之前的工作內容可以直接從commit 生成Change log(發布時用于說明版本…

5、flink任務中可以使用哪些轉換算子(Transformation)

1、什么是Flink中的轉換算子 在使用 Flink DataStream API 開發流式計算任務時,可以將一個或多個 DataStream 轉換成新的 DataStream,在應用程序中可以將多個數據轉換算子合并成一個復雜的數據流拓撲圖。 2、常用的轉換算子 Flink提供了功能各異的轉換算…

[論文筆記]ON LAYER NORMALIZATION IN THE TRANSFORMER ARCHITECTURE

引言 這是論文ON LAYER NORMALIZATION IN THE TRANSFORMER ARCHITECTURE的閱讀筆記。本篇論文提出了通過Pre-LN的方式可以省掉Warm-up環節,并且可以加快Transformer的訓練速度。 通常訓練Transformer需要一個仔細設計的學習率warm-up(預熱)階段:在訓練開始階段學習率需要設…

JDK 1.6與JDK 1.8的區別

ArrayList使用默認的構造方式實例 jdk1.6默認初始值為10jdk1.8為0,第一次放入值才初始化,屬于懶加載 Hashmap底層 jdk1.6與jdk1.8都是數組鏈表 jdk1.8是鏈表超過8時,自動轉為紅黑樹 靜態方式不同 jdk1.6是先初始化static后執行main方法。 jdk1.8是懶加…

設置PHP的fpm的系統性能參數pm.max_children

1 介紹 PHP從Apache module換成了Fpm,跑了幾天突然發現網站打不開了。 頁面顯示超時,檢查MySQL、Redis一眾服務都正常。 進入Fpm容器查看日志,發現了如下的錯誤信息: server reached pm.max_children setting (5), consider r…

python中的svm:介紹和基本使用方法

python中的svm:介紹和基本使用方法 支持向量機(Support Vector Machine,簡稱SVM)是一種常用的分類算法,可以用于解決分類和回歸問題。SVM通過構建一個超平面,將不同類別的數據分隔開,使得正負樣…

2023全國大學生數學建模競賽A題B題C題D題E題思路+模型+代碼+論文

目錄 一. 2023國賽數學建模思路: 賽題發布后會第一時間發布選題建議,思路,模型代碼等 詳細思路獲取見文末名片,9.7號第一時間更新 二.國賽常用的模型算法: 三、算法簡介 四.超重要!!&…

msvcp140.dll丟失的解決方法,如何預防msvcp140.dll丟失

在電腦操作系統中經常會彈出類似msvcp140.dll丟失的錯誤提示窗口,導致軟件無法正常運行。為什么會出現msvcp140.dll丟失的情況呢?出現這種情況應該如何解決呢?小編有三種解決方法分享給大家。 一.msvcp140.dll丟失的原因 1.安裝過程中受損:在…

前端框架學習-ES6新特性(尚硅谷web筆記)

ECMASript是由 Ecma 國際通過 ECMA-262 標準化的腳本程序設計語言。javaScript也是該規范的一種實現。 新特性目錄 筆記出處:b站ES6let 關鍵字const關鍵字變量的解構賦值模板字符串簡化對象寫法箭頭函數rest參數spread擴展運算符Promise模塊化 ES8async 和 await E…

云原生周刊:Kubernetes v1.28 新特性一覽 | 2023.8.14

推薦一個 GitHub 倉庫:Fast-Kubernetes。 Fast-Kubernetes 是一個涵蓋了 Kubernetes 的實驗室(LABs)的倉庫。它提供了關于 Kubernetes 的各種主題和組件的詳細內容,包括 Kubectl、Pod、Deployment、Service、ConfigMap、Volume、…

CF1013B And 題解

題目傳送門 題目意思: 給你一個長度為 n n n 的序列 a i a_i ai?,再給一個數 x x x。每一步你可以將序列中的一個數與上 x x x。請問最少要多少步才可以使得序列中出現兩個相同的數,如果無解輸出 ? 1 -1 ?1。 思路: 首…

Vue頁面刷新常用的4種方法

Vue項目里,有時候我們需要刷新頁面,重新加載頁面數據,常用方法如下: 方法一:location.reload() 方法全局刷新 使用 location.reload() 方法可以簡單地實現當前頁面的刷新,這個方法會重新加載當前頁面,類似于用戶點擊瀏覽器的刷新按鈕。 在 Vue 中,可以將該方法綁定到…

題解 | #M.Fair Equation# 2023牛客暑期多校10

M.Fair Equation 簽到題 題目大意 給定一個式子 A B C ABC ABC ,其中正整數 A , B , C ≤ 1 0 6 A,B,C\le 10^6 A,B,C≤106 問能否在 A , B , C A,B,C A,B,C 其中一個數的某一位置(可以是開頭和結尾)插入一個數字,使得等式…

Elasticsearch 查詢之Function Score Query

前言 ES 的主查詢評分模式分為兩種,是信息檢索領域的重要算法: TF-IDF 算法 和 BM25 算法。 Elasticsearch 從版本 5.0 開始引入了 BM25 算法作為默認的文檔評分(relevance scoring)算法。在此之前,Elasticsearch 使…

sip網絡號角喇叭 sip音柱 POE供電廣播音箱 ip網絡防水對講終端 sip網絡功放

SV-7042TP網絡號角喇叭 一、描述 SV-7042TP是我司的一款SIP網絡號角喇叭,具有10/100M以太網接口,內置有一個高品質揚聲器,將網絡音源通過自帶的功放和喇叭輸出播放,可達到功率30W。SV-7042TP作為SIP系統的播放終端,可…

【腳踢數據結構】常見樹總結(圖碼結和版)

(??? ),Hello我是祐言QAQ我的博客主頁:C/C語言,Linux基礎,ARM開發板,軟件配置等領域博主🌍快上🚘,一起學習,讓我們成為一個強大的攻城獅!送給自己和讀者的…

如何構造不包含字母和數字的webshell

利用不含字母與數字進行繞過 1.異或進行繞過 2.取反進行繞過 3.利用php語法繞過 利用不含字母與數字進行繞過 基本代碼運行思路理解 <?php echo "A"^""; ?> 運行結果為! 我們可以看到&#xff0c;輸出的結果是字符"!"。之所以會…

C++:字符串哈希

字符串哈希 給定一個長度為 n n n的字符串&#xff0c;再給定 m m m個詢問&#xff0c;每個詢問包含四個整數 l 1 , r 1 , l 2 , r 2 l_1,r_1,l_2,r_2 l1?,r1?,l2?,r2?&#xff0c;請你判斷 [ l 1 , r 1 ] [l_1,r_1] [l1?,r1?]和 [ l 2 , r 2 ] [l_2,r_2] [l2?,r2?]這…