當前位置:首頁 » 編程軟體 » go程序編譯大小

go程序編譯大小

發布時間: 2022-11-05 10:59:01

㈠ Go 語言交叉編譯和構建標簽

現代應用支持多平台運行是一件稀鬆平常的事情,在 Go 語言裡面,為了支持應用的多平台部署,給用戶提供了方便的配置方式來輕松構建針對不同操作系統和平台的運行文件。

Go 的構建約束,即構建標簽,是以 // go:build 為開始的行注釋,如果是 1.16 或之前的版本,格式是 // +build 。跟此變更相關的 issue 可以參考 25348 。

構建標簽必須出現在 package 子句之前。為了區分構建標簽和包文檔的描述注釋,構建標簽後面應該有一個空行。

構建標簽由||, &&, !運算符以及括弧來組合表達。運算符與 Go 中的含義相同。
例如,以下構建標簽在滿足 linux 和 386 約束,或者滿足 darwin 而 cgo 不滿足時構建文件:
//go:build (linux && 386) || (darwin && !cgo)
又如:僅在使用 cgo 時,且僅在 Linux 和 OS X 上構建文件: //go:build cgo && (linux || darwin)

注意:1.17 及以後的表達格式里,一個文件有多個 //go:build 行是錯誤的。

在 1.16 及以前的版本,多行構建標簽是允許的,並且組合方式是通過空格和逗號等來區分,空格符表示 OR,逗號表示 AND,感嘆號表示 NOT。而多行之間則表示 OR。gofmt 命令將在遇到舊語法時添加等效的 //go:build 約束。如下是示例:

如果文件名在去除擴展名和可能的 _test 後綴後匹配以下任何模式, (例如:source_windows_amd64.go)其中 GOOS 和 GOARCH 分別代表任何已知的操作系統和體系結構值,那麼認為該文件除了文件中的任何顯式約束之外,具有這些術語的所表達的隱式構建標簽。

除了官方提供的針對不同平台的內置標簽,用戶也可以使用自定義標簽,例如 //go:build prod , 只需要在執行 go build 時顯式帶上標簽名 go build --tags=prod 。
想要使文件構建時被忽略,可以使用: //go:build ignore ,其他任何沒有被用來定義為標簽的詞也可以,但"ignore"是約定俗成的。)。Go 語言目前支持的系統和架構可以參考 官方文檔 。

㈡ 現在go可以靜態編譯一個程序么

strip對Go的程序沒啥用的。

把Go程序變小的辦法是:
go build -ldflags "-s -w" (go install類似)
-s去掉符號表(然後panic時候的stack trace就沒有任何文件名/行號信息了,
這個等價於普通C/C++程序被strip的效果),
-w去掉DWARF調試信息,得到的程序就不能用gdb調試了。

比如,server.go是一個簡單的http server,用了net/http包。
$ go build server.go
$ ls -l server
-rwxr-xr-x 1 minux staff *4507004* 2012-10-25 14:16 server
$ go build -ldflags "-s -w" server.go
$ ls -l server
-rwxr-xr-x 1 minux staff *2839932* 2012-10-25 14:16 server

-s和-w也可以分開使用,一般來說如果不打算用gdb調試,-w基本沒啥損失。
-s的損失就有點大了。

㈢ 為什麼go語言編譯的程序很大

因為把go的runtime靜態鏈接進去了。

㈣ 如何寫 go 代碼

請自行查看我前面寫得GO語言開發環境和GO語言IDE編輯器的經驗文章
我們先寫一段GO代碼
很簡單就是列印輸出一個hello world!

保存為print.go文件
然後再CMD下一路cd到print.go目錄下來

在cmd下運行 go run print.go就可以運行go程序了

看看運行結果

GO程序的代碼是可以直接編譯成exe文件的
在print.go目錄下運行 go build print.go即可把go程序編譯成exe文件

完成之後看看exe文件是否存在

最好我們要看看運行exe的效果

㈤ 如何配置go語言開發環境

1、下載go的zip文件。並且一定要把文件解壓到c:\go目錄下。
2、配置windows的高級環境變數。包括:GOROOT、GOOS、GOBIN、GOARCH。並且在path變數裡面把c:\go\bin加入。以便可以在命令行直接運行go命令。
舉例:我的機器:
GOPATH= c:\go;c:\go\src;F:\workspace\goSample01;
GOBIN=c:\go\bin;F:\workspace\goSample01\bin;
其中,c:\go是go的安裝路徑;
F:\workspace\goSample01是我寫的go語言項目的工程目錄;
F:\workspace\goSample01\bin是go語言項目的工程目錄下的可執行文件路徑;

3、在完成環境變數配置後,打開一個命令行窗口,直接輸入go,然後回車,看看是否出現go的幫助信息。如果出現,那麼go的基本環境就OK了。
注意:這個基本環境不包含開發工具,也不能直接編譯帶C代碼的go程序。
4、(可選)為了支持Import遠程包,最好裝個gomingw。下載地址:http://code.google.com/p/gomingw/downloads/list。如果下的是壓縮包,請把它解壓到C盤。例如,C:\gowin-env。裡面有個Console.bat是以後使用go get的環境。舉例:有個文件a.go,裡面import(
"fmt"
"github.com/astaxie/beedb"
_ "github.com/ziutek/mymysql/godrv"
為了編譯該a.go文件,需要啟動Console.bat,然後在該命令行窗口,進入c:\go\src目錄下,執行go getgithub.com/astaxie/beedb
Go get github.com/ziutek/mymysql/godrv .
Go會自動下載該遠程包並編譯和安裝這些包。
配置goclipse(可選)
(如果不喜歡eclipse開發工具,請跳過這個配置。)
1、下載並安裝goclipse插件。Goclipse是go語言for eclipse的插件,下載地址:http://code.google.com/p/goclipse/
2、啟動eclipse並創建go項目。然後寫個最簡單的helloworld.go文件,並運行。代碼如下:
packagemainimport"fmt"func main(){ fmt.Printf("hello, world")}
配置gocode(可選)
如果不需要go語法輔助和eclipse裡面的(按ALT+/)彈出go語言自動輔助功能,請跳過這個配置。
1、下載gocode的zip文件,解壓後放在go的bin目錄下。
2、下載並安裝Git軟體。並且在path裡面配置git的執行路徑。例如c:\git\bin
3、在命令行執行:go build .\gocode。如果一切正常,那麼將會編譯生成一個gocode.exe文件在go的bin目錄下。如果編譯失敗,那麼就轉第4步。
4、如果第3步直接編譯gocode源文件成功,那就直接到第5步。否則,就需要通過git下載gocode源文件,然後再編譯。在命令行執行:go get -u github.com/nsf/gocode 。就會生成gocode.exe文件。
5、在goclipse插件裡面指定gocode的路徑。就可以在elcipse裡面調用gocode來幫助寫編碼了。
從開發工具這塊看,go語言還不夠成熟,開發工具都還不完善,有待改進。
下載go-tour教程源代碼(可選)
Google有個在線運行go語言的教程(http://tour.golang.org/#2),很不錯。支持在web上直接運行大部分的go程序,想了解這個教程的源代碼的朋友可以通過以下方式獲取。如果沒興趣,可以跳過這個步驟。

1、下載安裝Mercurial軟體。
2、在命令行下輸入:
hg clone http://[email protected]/r/qinhui99-go-tour/
http://[email protected]/r/qinhui99-go-tour/這個URL是我從google的go-tour源代碼的一個clone。作為測試用的。如果把http改成https協議,下載就會失敗。搞不懂。

編譯帶調用C代碼的go文件(可選)

1、為了在windows下編譯帶C代碼的go程序,你首先需要下載並安裝MinGW或者Cygwin。
2、首選安裝MinGW。在安裝MinGW之後,記得要把MinGW安裝目錄\bin路徑設置在path環境變數裡面,以便能在dos窗口下直接調用gcc。
3、下載一個gowin-env。下載地址:gowin-env。下載後解壓到某個目錄下,例如:C:\gowin-env. 然後,編輯go-env.bat。配置相關的go參數。例如,我的配置是:
set GOARCH=386
set GOOS=windows
set GOROOT=c:\go
set GOBIN=%GOROOT%\bin
set GOPATH=%GOROOT%;F:\workspace\goSample01;
設置好go-env.bat後,就可以點擊Console.bat來啟動編譯和運行窗口。

4、編寫一個帶C代碼的go程序。例如,testc.go
5、編譯
例如:
go build -compiler gccgo test_c.go

運行調用C代碼的go文件(可選)
1、testc.go.
創建rand目錄,然後在rand裡面創建testc.go. 代碼如下:
package rand
/*
//
#include <stdio.h>
*/
import "C"
func PrintHello() {
C.puts(C.CString("Hello, world\n"))
}
2、a.go
在rand下創建a.go.代碼如下:
package rand
import "fmt"
func SayHello(name string){
fmt.Println(name)
}
3、test_import.go
在rand的上一級創建test_import.go。代碼如下:
package main

import "./rand"

func main(){
rand.SayHello("tom")
rand.PrintHello()
}

4、運行test_import.go
go run test_import.go

在測試其它幾個C代碼的時候,發現windows版本的cgo還有些編譯問題,同樣的代碼轉移到蘋果的XCODE下就沒有問題。後來終於發現原因了,原來有些例子是unix平台下的,而在windows平台下,方法名和參數需要做調整。
例如:下面代碼在windows下編譯報一堆錯誤。
package rand
/*
#include <stdlib.h>
*/
import "C"

func Random() int {
return int(C.random())
}

func Seed(i int) {
C.srandom(C.uint(i))
}
這里需要把return int(C.random()) 修改為「return int(C.rand())」
C.srandom(C.uint(i))修改為「C.srand(C.uint(i))」編譯就OK了。

㈥ 如何配置go語言開發環境

1、下載go的zip文件。並且一定要把文件解壓到c:\go目錄下。
2、配置windows的高級環境變數。包括:GOROOT、GOOS、GOBIN、GOARCH。並且在path變數裡面把c:\go\bin加入。以便可以在命令行直接運行go命令。
舉例:我的機器:
GOPATH= c:\go;c:\go\src;F:\workspace\goSample01;
GOBIN=c:\go\bin;F:\workspace\goSample01\bin;
其中,c:\go是go的安裝路徑;
F:\workspace\goSample01是我寫的go語言項目的工程目錄;
F:\workspace\goSample01\bin是go語言項目的工程目錄下的可執行文件路徑;

3、在完成環境變數配置後,打開一個命令行窗口,直接輸入go,然後回車,看看是否出現go的幫助信息。如果出現,那麼go的基本環境就OK了。
注意:這個基本環境不包含開發工具,也不能直接編譯帶C代碼的go程序。
4、(可選)為了支持Import遠程包,最好裝個gomingw。下載地址:http://code.google.com/p/gomingw/downloads/list。如果下的是壓縮包,請把它解壓到C盤。例如,C:\gowin-env。裡面有個Console.bat是以後使用go get的環境。舉例:有個文件a.go,裡面import(
"fmt"
"github.com/astaxie/beedb"
_ "github.com/ziutek/mymysql/godrv"
為了編譯該a.go文件,需要啟動Console.bat,然後在該命令行窗口,進入c:\go\src目錄下,執行go getgithub.com/astaxie/beedb
Go get github.com/ziutek/mymysql/godrv .
Go會自動下載該遠程包並編譯和安裝這些包。
配置goclipse(可選)
(如果不喜歡eclipse開發工具,請跳過這個配置。)
1、下載並安裝goclipse插件。Goclipse是go語言for eclipse的插件,下載地址:http://code.google.com/p/goclipse/
2、啟動eclipse並創建go項目。然後寫個最簡單的helloworld.go文件,並運行。代碼如下:
packagemainimport"fmt"func main(){ fmt.Printf("hello, world")}
配置gocode(可選)
如果不需要go語法輔助和eclipse裡面的(按ALT+/)彈出go語言自動輔助功能,請跳過這個配置。
1、下載gocode的zip文件,解壓後放在go的bin目錄下。
2、下載並安裝Git軟體。並且在path裡面配置git的執行路徑。例如c:\git\bin
3、在命令行執行:go build .\gocode。如果一切正常,那麼將會編譯生成一個gocode.exe文件在go的bin目錄下。如果編譯失敗,那麼就轉第4步。
4、如果第3步直接編譯gocode源文件成功,那就直接到第5步。否則,就需要通過git下載gocode源文件,然後再編譯。在命令行執行:go get -u github.com/nsf/gocode 。就會生成gocode.exe文件。
5、在goclipse插件裡面指定gocode的路徑。就可以在elcipse裡面調用gocode來幫助寫編碼了。
從開發工具這塊看,go語言還不夠成熟,開發工具都還不完善,有待改進。
下載go-tour教程源代碼(可選)
Google有個在線運行go語言的教程(http://tour.golang.org/#2),很不錯。支持在web上直接運行大部分的go程序,想了解這個教程的源代碼的朋友可以通過以下方式獲取。如果沒興趣,可以跳過這個步驟。

㈦ go是什麼編程語言主要應用於哪些方面

Go語言由Google公司開發,並於2009年開源,相比Java/Python/C等語言,Go尤其擅長並發編程,性能堪比C語言,開發效率肩比Python,被譽為「21世紀的C語言」。
Go語言在雲計算、大數據、微服務、高並發領域應用應用非常廣泛。BAT大廠正在把Go作為新項目開發的首選語言。
Go語言能幹什麼?
1、服務端開發:以前你使用C或者C++做的那些事情,用Go來做很合適,例如日誌處理、文件系統、監控系統等;
2、DevOps:運維生態中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go語言開發;
3、網路編程:大量優秀的Web框架如Echo、Gin、Iris、beego等,而且Go內置的 net/http包十分的優秀;
4、Paas雲平台領域:Kubernetes和Docker Swarm等;
5、分布式存儲領域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、區塊鏈領域:區塊鏈裡面有兩個明星項目以太坊和fabric都使用Go語言;
7、容器虛擬化:大名鼎鼎的Docker就是使用Go語言實現的;
8、爬蟲及大數據:Go語言天生支持並發,所以十分適合編寫分布式爬蟲及大數據處理。

㈧ 為什麼go語言的hello world程序編譯後有2M那麼大

https://segmentfault.com/q/1010000005043461/a-1020000005043860/revision

㈨ golang 新人求教,有沒有辦法使用64位的開發環境編譯出兼容32位系

先set GOARCH=386

然後再go build 生成32位可執行文件

㈩ 現在go可以靜態編譯一個程序么

第一步:all.bash

% cd $GOROOT/src
% ./all.bash

第一步有些突兀,因為 all.bash 僅僅調用了其它兩個 shell 腳本;make.bash 和 run.bash。如果你在使用 Windows 或 Plan 9,過程是一樣的,只是腳本擴展名變成了.bat 或.rc。對於本文中的其它腳本,請根據你的系統適當改動。
第二步:make.bash

. ./make.bash --no-banner

main.bash 來源於 all.bash,因此調用退出將正確終止便宜進程。main.bash 有三個主要工作,第一個是驗證編譯 Go 的環境是否完整。完整性檢查在過去幾年中建立,它通常嘗試避免使用已知的破損工具或必然失敗的環境進行編譯。
第三步. cmd/dist

gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist cmd/dist/*.c

一旦可用性檢查完畢,make.bash 將編譯產生 cmd/dist,cmd/dist取代了之前存在於Go 1 之前的Makefile 編譯系統。cmd/dist用來管理少量的pkg/runtime的代碼生成。cmd/dist 是C語言編寫的程序,能夠充分利用系統C編譯器和頭文件來處理大部分主機系統平台的檢測。cmd/dist通常用來檢測主機的操作系統和體系結構,即環境變數$GOHOSTOS和$GOHOSTARCH .如果是交叉編譯的話,變數 $GOOS和$GOARCH可能會由於你的設置而不同。事實上,Go 通常用作跨平台編譯器,只不過多數情況下,主機和目標系統一致而已。接下來,make.bash 調用cmd/dist 的引導參數的支持庫、 lib9、 libbio 和 libmach,使用編譯器套件,然後用自己的編譯器進行編譯。這些工具也是用 C 語言寫的中,但是由系統 C 編譯器編譯產生。

echo "# Building compilers and Go bootstrap tool for host, $GOHOSTOS/$GOHOSTARCH."
buildall="-a"
if [ "$1" = "--no-clean" ]; then
buildall=""
fi
./cmd/dist/dist bootstrap $buildall -v # builds go_bootstrap

使用的編譯器套件 cmd/dist 編譯產生一個版本的gotool,go_bootstrap。但go_bootstrap並不是完整得gotool,比方說 pkg/net 就是孤立的,避免了依賴於 cgo。要編譯的文件的列表以及它們的依賴項,是由cmd/dist編譯的 ,所以十分謹慎地避免引入新的生成依賴項 到 cmd/go。

第四步:go_bootstrap

現在, go_bootstrap 編譯完成了,make.bash 的最後一部就是使用 go_bootstrap 完成 Go 標准庫的編譯,包括整套 gotool 的替換版。

echo "# Building packages and commands for $GOOS/$GOARCH."
"$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" \
-ldflags "$GO_LDFLAGS" -v std

第五步:run.bash

現在,make.bash 完成了,運行回到了 all.bash,它將引用 run.bash。run.bash 的工作是編譯和測試標准庫,運行時以及語言測試套件。

bash run.bash --no-rebuild

使用 --no-rebuild 標識是因為 make.bash 和 run.bash 可能都調用了 go install -a std,這樣可以避免重復,--no-rebuild 跳過了第二個 go install。

# allow all.bash to avoid double-build of everything
rebuild=true
if [ "$1" = "--no-rebuild" ]; then
shift
else
echo '# Building packages and commands.'
time go install -a -v std
echo
fi

第六步:go test -a std

echo '# Testing packages.'
time go test std -short -timeout=$(expr 120 \* $timeout_scale)s
echo

下一步 run.bash z則是對標准庫中的所有包進行單元測試,這是使用 testing 包編寫的。由於 $GOPATH 和 $GOROOT 中的代碼存在於同一個命名空間中,我們不能使用 go test,這可能會測試 $GOPATH 中的所有包,所以將創建別名std來標識標准庫中的包。由於有些測試需要很長時間,或耗用大量內存,測試將會通過 -short 標識將其過濾。
第七步 runtime 和 cgo 測試

run.bash的下一節將運行大量對cgo支持的平台測試,運行一些季春測試,編譯 Go 附帶的一些雜項程序。隨著時間的推移,這份雜項程序列表已經變長了,當它們發現自己並不包含在編譯過程中時,沉默將不可避免的被打破。

第八步: go run test

(xcd ../test
unset GOMAXPROCS
time go run run.go
) || exit $?

run.bash的倒數第二步調用了$GOROOT目錄下test文件夾中的編譯器和運行時測試。這其中有描述編譯器和運行時本身的低層級測試。而子目錄 test/bugs 及 test/fixedbugs 中的測試對已知問題和已解決問題進行特別的測試。所有測試的測試驅動器是 $GOROOT/test/run.go,該程序很小,它調用test文件夾中的每個.go 文件。有些 .go 文件在首行上描述了預期的運行結果,例如,程序失敗或是放出特定的輸出隊列。

第九步go tool api

echo '# Checking API compatibility.'
go tool api -c $GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt \
-next $GOROOT/api/next.txt -except $GOROOT/api/except.txt

run.bash的最後一部將調用API工具,API工具的作用是執行 Go 1 約定;導出的符號,常數,函數,變數,類型和方法組成2012年確認的 Go 1 API。Go 1 寫在 api/go1.txt 文件,而 Go 1.1 則寫在 api/go1.1.txt文件中。另一個額外的文件,api/next.txt 描述了G 1.1自後添加到標准庫和運行時中的符號。當 Go 1.2 發布時,這個文件將會成為 Go 1.2 的約定,另一個新的 next.txt 文件也將被創建。這里還有一個小文件,except.txt,它包括 Go 1 約定中被批準的擴展。對文件的增添總是小心翼翼的。

熱點內容
wemall微商城源碼 發布:2025-05-14 22:15:20 瀏覽:802
隆地優選交易密碼是什麼 發布:2025-05-14 21:53:23 瀏覽:93
強酸強鹼存儲櫃 發布:2025-05-14 21:45:16 瀏覽:563
車輛參數配置包括什麼 發布:2025-05-14 21:31:03 瀏覽:163
怎麼引入安卓項目 發布:2025-05-14 21:26:39 瀏覽:824
游戲輔編程 發布:2025-05-14 21:18:49 瀏覽:687
三菱plc一段二段密碼什麼意思 發布:2025-05-14 21:17:16 瀏覽:528
電腦開機密碼忘記了怎麼破解 發布:2025-05-14 21:09:40 瀏覽:57
pythondict格式 發布:2025-05-14 21:09:38 瀏覽:886
落葉片拍攝腳本 發布:2025-05-14 20:40:49 瀏覽:799