go struct 靜態函式 golang靜態編譯

2021-10-17 05:13:48 字數 658 閱讀 1556

golang 的編譯(不涉及 cgo 編譯的前提下)預設使用了靜態編譯,不依賴任何動態鏈結庫。

這樣可以任意部署到各種執行環境,不用擔心依賴庫的版本問題。只是體積大一點而已,儲存時占用了一點磁碟,執行時,多占用了一點記憶體。早期動態鏈結庫的產生,是因為早期的系統的記憶體資源十分寶貴,由於記憶體緊張的問題在早期的系統中顯得更加突出,因此人們首先想到的是要解決記憶體使用效率不高這一問題,於是便提出了動態裝入的思想。也就產生了動態鏈結庫。在現在的計算機裡,作業系統的硬碟記憶體更大了,尤其是伺服器,32g、64g 的記憶體都是最基本的。可以不用為了節省幾百 kb 或者1m,幾 m 的記憶體而大大費周折了。而 golang 就採用這種做法,可以避免各種 so 動態鏈結庫依賴的問題,這點是非常值得稱讚的。

顯示指定靜態編譯方法

在docker化的今天, 我們經常需要靜態編譯乙個go程式,以便方便放在docker容器中。 即使你沒有引用其它的第三方包,只是在程式中使用了標準庫net,你也會發現你編譯後的程式依賴glic,這時候你需要glibc-static庫,並且靜態連線。

不同的go版本下靜態編譯方式還有點不同,在go 1.10下, 下面的方式會盡可能做到靜態編譯:

cgo_enabled=0 go build -a -ldflags '-extldflags "-static"' .

參考:

靜態函式與非靜態函式的區別

靜態成員函式和非靜態成員函式的根本區別在於有無this指標。非靜態函式由物件名或者物件指標 呼叫,呼叫時編譯器會向函式傳遞this指標 靜態成員函式則由類名 或者物件名呼叫 非靜態函式中有this指標,靜態函式中沒有this指標,不能訪問物件的成員函式,成員函式有this指標,const修飾this...

c靜態函式

c程式一直由下列部分組成 1 正文段 cpu執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 2 初始化資料段 資料段 在程式中所有賦了初值的全域性變數,存放在這裡。3 非初始化資料段 bss段 在程式中沒有初始化的全域性變數 核心將此段初始化為0。5 堆 動態儲存...

靜態函式呼叫

include class point static void init 靜態成員函式 呼叫1 非靜態成員函式和非靜態成員屬於物件的方法和資料,也就是先產生類的物件,然後通過類的物件去引用。void main 呼叫2 靜態成員函式和靜態成員變數屬於類本身,在類載入的時候,即為它們分配了空間,所以可通...