敞开成长之旅!这是我参加「日新方案 2 月更文应战」的第 31 天,点击检查活动概况
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未设置环境变量,掩盖检测的二进制文件仍将正确履行,但会发出警告。
敞开成长之旅!这是我参加「日新方案 2 月更文应战」的第 31 天,点击检查活动概况