語言編程花絮內建構建順序示例詳解

1 構建 順序

依據詞法名順序 當導入一個包,且這個包 定義瞭 init(), 那麼導入時init()將被執行。

具體執行順序: 全局變量定義時的函數

    import 執行導入 -> cont 執行常量 
	       --> var 執行變量 --> 執行初始化 init() --> 執行 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.")
		}
	}

其他事項: 執行 返回打印 It's all a lie.

main() 函數隻能有 1 個,但 init() 函數可以有很多。 您不需要顯式調用 init() 或 main(),它們會自動調用。

init() 和 main() 不接受任何參數,也不返回任何內容。 init() 在 main() 之前運行。

如果你有很多 init(),它們會按照聲明的順序運行

程序初始化在單個 goroutine 中運行,但該 goroutine 可能會創建其他並發運行的 goroutine。

如果包 p 導入包 q,q 的 init 函數的完成發生在任何 p 的開始之前。 函數 main.main 的啟動發生在所有 init 函數完成之後。

查看函數加載順序:

	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 交叉編譯

設置環境信息

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

這會同時生成libChinaPYG_arm64.a、libChinaPYG_arm64.h兩個文件,直接嵌入到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 設置

1.Mac Mac下編譯Linux, Windows平臺的64位可執行程序:

	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平臺的64位可執行程序:

	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平臺的64位可執行程序:

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 構建測試支持

Go 提供易於使用的支持,用於通過“ go test -coverprofile=… <pkg_target>”命令在包單元測試級別收集覆蓋率配置文件。

從 Go 1.20 開始,用戶現在可以為更大的集成測試收集覆蓋率配置文件:更重量級、更復雜的測試,執行給定應用程序二進制文件的多次運行。

對於單元測試,收集覆蓋率概況和生成報告需要兩個步驟:go test -coverprofile=…運行,然後調用go tool cover {-func,-html}生成報告。

對於集成測試,需要三個步驟:構建步驟、運行步驟(可能涉及從構建步驟多次調用二進制文件),最後是報告步驟,如下所述。

構建用於覆蓋率分析的二進制文件,要構建用於收集覆蓋率配置文件的應用程序,請-cover在調用go build應用程序二進制目標時傳遞標志。

請參閱下面的示例go build -cover調用部分。然後可以使用環境變量設置運行生成的二進制文件以捕獲覆蓋率配置文件(請參閱下一節運行)。

  • 如何為檢測選擇包

在給定的“ go build -cover”調用期間,Go 命令將選擇主模塊中的包進行覆蓋率分析;默認情況下,不會包含提供給構建的其他包(go.mod 中列出的依賴項,或作為 Go 標準庫一部分的包)。

例如,這是一個玩具程序,包含一個主包、一個本地主模塊包greetings和一組從模塊外部導入的包,包括(除其他外)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”命令行標志構建此程序並運行它,配置文件中將恰好包含兩個包:main和mydomain.com/greetings;其他依賴包將被排除在外。

想要更好地控制包含哪些包以進行覆蓋的用戶可以使用“ -coverpkg”標志進行構建。例子:

	$ go build -cover -o myprogramMorePkgs.exe -coverpkg=io,mydomain.com,rsc.io/quote .
	$

在上面的構建中,選擇瞭 main 包mydomain.com以及rsc.io/quote和io包進行分析;因為 mydomain.com/greetings沒有具體列出,所以它將被排除在配置文件之外,即使它位於主模塊中。

  • 運行覆蓋檢測的二進制文件

用“”構建的二進制-cover文件在執行結束時將配置文件數據文件寫到通過環境變量指定的目錄中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
	$

請註意寫入目錄的兩個文件somedata:這些(二進制)文件包含覆蓋率結果。有關如何從這些數據文件生成人類可讀結果的更多信息,請參閱以下有關報告的部分。

如果GOCOVERDIR未設置環境變量,覆蓋檢測的二進制文件仍將正確執行,但會發出警告。

以上就是語言編程花絮內建構建順序示例詳解的詳細內容,更多關於編程語言內建構建順序的資料請關註WalkonNet其它相關文章!

推薦閱讀: