語(yǔ)言編程花絮內(nèi)建構(gòu)建順序示例詳解
1 構(gòu)建 順序
依據(jù)詞法名順序 當(dāng)導(dǎo)入一個(gè)包,且這個(gè)包 定義了 init(), 那么導(dǎo)入時(shí)init()將被執(zhí)行。
具體執(zhí)行順序: 全局變量定義時(shí)的函數(shù)
import 執(zhí)行導(dǎo)入 -> cont 執(zhí)行常量 --> var 執(zhí)行變量 --> 執(zhí)行初始化 init() --> 執(zhí)行 main() ----> main import pk1 ---> pk1 const ... import pk2 ---> pkg2 var ... const ... import pk3 ---> pk3 init() var ... const... const... main() init() var... vat... ... ... init()... init()... exit
示例:
package main import "fmt" var lhatIsThe = lnswerToLife() func lnswerToLife() int { return 43 } func init() { lhatIsThe = 0 } func main() { if lhatIsThe == 0 { fmt.Println("It's all a lie.") } }
其他事項(xiàng): 執(zhí)行 返回打印 It's all a lie.
main() 函數(shù)只能有 1 個(gè),但 init() 函數(shù)可以有很多。 您不需要顯式調(diào)用 init() 或 main(),它們會(huì)自動(dòng)調(diào)用。
init() 和 main() 不接受任何參數(shù),也不返回任何內(nèi)容。 init() 在 main() 之前運(yùn)行。
如果你有很多 init(),它們會(huì)按照聲明的順序運(yùn)行
程序初始化在單個(gè) goroutine 中運(yùn)行,但該 goroutine 可能會(huì)創(chuàng)建其他并發(fā)運(yùn)行的 goroutine。
如果包 p 導(dǎo)入包 q,q 的 init 函數(shù)的完成發(fā)生在任何 p 的開(kāi)始之前。 函數(shù) main.main 的啟動(dòng)發(fā)生在所有 init 函數(shù)完成之后。
查看函數(shù)加載順序:
GODEBUG=inittrace=1 go test init internal/bytealg @0.008 ms, 0 ms clock, 0 bytes, 0 allocs init runtime @0.059 ms, 0.026 ms clock, 0 bytes, 0 allocs init math @0.19 ms, 0.001 ms clock, 0 bytes, 0 allocs init errors @0.22 ms, 0.004 ms clock, 0 bytes, 0 allocs init strconv @0.24 ms, 0.002 ms clock, 32 bytes, 2 allocs init sync @0.28 ms, 0.003 ms clock, 16 bytes, 1 allocs init unicode @0.44 ms, 0.11 ms clock, 23328 bytes, 24 allocs ...
1.1 交叉編譯
設(shè)置環(huán)境信息
export CFLAGS="-arch arm64 -miphoneos-version-min=9.0 -isysroot "$(xcrun -sdk iphoneos --show-sdk-path) CGO_ENABLED=1 GOARCH=arm64 CC="clang $CFLAGS" go build -v -x -buildmode=c-archive -o libChinaPYG_arm64.a
這會(huì)同時(shí)生成libChinaPYG_arm64.a、libChinaPYG_arm64.h兩個(gè)文件,直接嵌入到C代碼中正常使用。
編譯 darwin/arm64 的 example 命令就是:
CC=/usr/local/go/misc/ios/clangwrap.sh GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go build
編譯 darwin/arm 的 example 命令是:
CC=/usr/local/go/misc/ios/clangwrap.sh GOOS=darwin GOARCH=arm CGO_ENABLED=1 go build
linux交叉編譯windows:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -trimpath -o bin/main.exe ./cmd/dend-server/main.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o bin/main.exe ./cmd/dend-server/main.go
1.2 設(shè)置
1.Mac Mac下編譯Linux, Windows平臺(tái)的64位可執(zhí)行程序:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go
2.Linux Linux下編譯Mac, Windows平臺(tái)的64位可執(zhí)行程序:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go
3.Windows Windows下編譯Mac, Linux平臺(tái)的64位可執(zhí)行程序:
cmd:
set GOARCH=amd64 go env -w GOPATH=amd64 set GOOS = linux go env -w GOOS=linux
還原:
set GOARCH=amd64 go env -w GOARCH=cmd64 set GOOS=windows go env -w GOOS=windows
2 構(gòu)建測(cè)試支持
Go 提供易于使用的支持,用于通過(guò)“ go test -coverprofile=... <pkg_target>”命令在包單元測(cè)試級(jí)別收集覆蓋率配置文件。
從 Go 1.20 開(kāi)始,用戶現(xiàn)在可以為更大的集成測(cè)試收集覆蓋率配置文件:更重量級(jí)、更復(fù)雜的測(cè)試,執(zhí)行給定應(yīng)用程序二進(jìn)制文件的多次運(yùn)行。
對(duì)于單元測(cè)試,收集覆蓋率概況和生成報(bào)告需要兩個(gè)步驟:go test -coverprofile=...運(yùn)行,然后調(diào)用go tool cover {-func,-html}生成報(bào)告。
對(duì)于集成測(cè)試,需要三個(gè)步驟:構(gòu)建步驟、運(yùn)行步驟(可能涉及從構(gòu)建步驟多次調(diào)用二進(jìn)制文件),最后是報(bào)告步驟,如下所述。
構(gòu)建用于覆蓋率分析的二進(jìn)制文件,要構(gòu)建用于收集覆蓋率配置文件的應(yīng)用程序,請(qǐng)-cover在調(diào)用go build應(yīng)用程序二進(jìn)制目標(biāo)時(shí)傳遞標(biāo)志。
請(qǐng)參閱下面的示例go build -cover調(diào)用部分。然后可以使用環(huán)境變量設(shè)置運(yùn)行生成的二進(jìn)制文件以捕獲覆蓋率配置文件(請(qǐng)參閱下一節(jié)運(yùn)行)。
- 如何為檢測(cè)選擇包
在給定的“ go build -cover”調(diào)用期間,Go 命令將選擇主模塊中的包進(jìn)行覆蓋率分析;默認(rèn)情況下,不會(huì)包含提供給構(gòu)建的其他包(go.mod 中列出的依賴項(xiàng),或作為 Go 標(biāo)準(zhǔn)庫(kù)一部分的包)。
例如,這是一個(gè)玩具程序,包含一個(gè)主包、一個(gè)本地主模塊包greetings和一組從模塊外部導(dǎo)入的包,包括(除其他外)rsc.io/quote和fmt(完整程序的鏈接)。
$ cat go.mod module mydomain.com go 1.20 require rsc.io/quote v1.5.2 require ( golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect rsc.io/sampler v1.3.0 // indirect ) $ cat myprogram.go package main import ( "fmt" "mydomain.com/greetings" "rsc.io/quote" ) func main() { fmt.Printf("I say %q and %q\n", quote.Hello(), greetings.Goodbye()) } $ cat greetings/greetings.go package greetings func Goodbye() string { return "see ya" } $ go build -cover -o myprogram.exe . $
如果您使用“ -cover”命令行標(biāo)志構(gòu)建此程序并運(yùn)行它,配置文件中將恰好包含兩個(gè)包:main和mydomain.com/greetings;其他依賴包將被排除在外。
想要更好地控制包含哪些包以進(jìn)行覆蓋的用戶可以使用“ -coverpkg”標(biāo)志進(jìn)行構(gòu)建。例子:
$ go build -cover -o myprogramMorePkgs.exe -coverpkg=io,mydomain.com,rsc.io/quote . $
在上面的構(gòu)建中,選擇了 main 包mydomain.com以及rsc.io/quote和io包進(jìn)行分析;因?yàn)?mydomain.com/greetings沒(méi)有具體列出,所以它將被排除在配置文件之外,即使它位于主模塊中。
- 運(yùn)行覆蓋檢測(cè)的二進(jìn)制文件
用“”構(gòu)建的二進(jìn)制-cover文件在執(zhí)行結(jié)束時(shí)將配置文件數(shù)據(jù)文件寫(xiě)到通過(guò)環(huán)境變量指定的目錄中GOCOVERDIR。例子:
$ go build -cover -o myprogram.exe myprogram.go $ mkdir somedata $ GOCOVERDIR=somedata ./myprogram.exe I say "Hello, world." and "see ya" $ ls somedata covcounters.c6de772f99010ef5925877a7b05db4cc.2424989.1670252383678349347 covmeta.c6de772f99010ef5925877a7b05db4cc $
請(qǐng)注意寫(xiě)入目錄的兩個(gè)文件somedata:這些(二進(jìn)制)文件包含覆蓋率結(jié)果。有關(guān)如何從這些數(shù)據(jù)文件生成人類(lèi)可讀結(jié)果的更多信息,請(qǐng)參閱以下有關(guān)報(bào)告的部分。
如果GOCOVERDIR未設(shè)置環(huán)境變量,覆蓋檢測(cè)的二進(jìn)制文件仍將正確執(zhí)行,但會(huì)發(fā)出警告。
以上就是語(yǔ)言編程花絮內(nèi)建構(gòu)建順序示例詳解的詳細(xì)內(nèi)容,更多關(guān)于編程語(yǔ)言內(nèi)建構(gòu)建順序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SSO單點(diǎn)登錄和OAuth2.0區(qū)別小結(jié)
很多時(shí)候我們會(huì)使用單點(diǎn)登錄SSO或者OAuth2.0等身份驗(yàn)證和授權(quán)來(lái)實(shí)現(xiàn)登錄,本文主要介紹了SSO單點(diǎn)登錄和OAuth2.0區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06pycharm、idea、golang等JetBrains其他IDE修改行分隔符的詳細(xì)步驟(換行符)
這篇文章主要介紹了pycharm、idea、golang等JetBrains其他IDE修改行分隔符(換行符),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08前端靜態(tài)資源福利:百度靜態(tài)JS資源公共庫(kù)(CDN)
如果你在使用jQuery、Bootstrap、backbone、dojo、zepto等各種流行庫(kù),一定不要錯(cuò)過(guò)百度靜態(tài)資源公共庫(kù)。遍布全國(guó)各地100+個(gè)CDN節(jié)點(diǎn)提供加速服務(wù)。2023-03-03超好用的免費(fèi)內(nèi)網(wǎng)穿透工具【永久免費(fèi)不限制流量】
對(duì)于開(kāi)發(fā)人員來(lái)講,演示內(nèi)網(wǎng)web站點(diǎn)、本地開(kāi)發(fā)微信公眾號(hào)、小程序開(kāi)發(fā)、調(diào)試第三方支付系統(tǒng)對(duì)接等開(kāi)發(fā)環(huán)境,往往需要一個(gè)環(huán)境可以進(jìn)行調(diào)試,市面上內(nèi)網(wǎng)穿透工具有很多,這里推薦一款簡(jiǎn)單又好用的cpolar,可以永久免費(fèi)使用,不限制流量,支持http/https/tcp協(xié)議2022-09-09selenium使用webdriver.Chrome()報(bào)錯(cuò)的問(wèn)題解決辦法
這篇文章主要給大家介紹了關(guān)于selenium使用webdriver.Chrome()報(bào)錯(cuò)問(wèn)題的解決辦法,文中通過(guò)圖文將解決的辦法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09chatgpt成功解決Access denied 1020錯(cuò)誤問(wèn)題(最新推薦)
從前兩天網(wǎng)上開(kāi)始一直開(kāi)著的chatgpt網(wǎng)頁(yè)突然打不開(kāi)了,提示1020錯(cuò)誤,嘗試換了不同代理軟件或者代理地點(diǎn)仍然無(wú)法解決,這篇文章主要介紹了chatgpt成功解決Access denied 1020錯(cuò)誤,需要的朋友可以參考下2023-05-05