语言编程花絮内建构建顺序示例详解

作者:楽码 时间:2023-11-04 09:42:12 

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 提供易于使用的支持,用于通过&ldquo; go test -coverprofile=... <pkg_target>&rdquo;命令在包单元测试级别收集覆盖率配置文件。

从 Go 1.20 开始,用户现在可以为更大的集成测试收集覆盖率配置文件:更重量级、更复杂的测试,执行给定应用程序二进制文件的多次运行。

对于单元测试,收集覆盖率概况和生成报告需要两个步骤:go test -coverprofile=...运行,然后调用go tool cover {-func,-html}生成报告。

对于集成测试,需要三个步骤:构建步骤、运行步骤(可能涉及从构建步骤多次调用二进制文件),最后是报告步骤,如下所述。

构建用于覆盖率分析的二进制文件,要构建用于收集覆盖率配置文件的应用程序,请-cover在调用go build应用程序二进制目标时传递标志。

请参阅下面的示例go build -cover调用部分。然后可以使用环境变量设置运行生成的二进制文件以捕获覆盖率配置文件(请参阅下一节运行)。

  • 如何为检测选择包

在给定的&ldquo; go build -cover&rdquo;调用期间,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 .
$

如果您使用&ldquo; -cover&rdquo;命令行标志构建此程序并运行它,配置文件中将恰好包含两个包:main和mydomain.com/greetings;其他依赖包将被排除在外。

想要更好地控制包含哪些包以进行覆盖的用户可以使用&ldquo; -coverpkg&rdquo;标志进行构建。例子:

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

在上面的构建中,选择了 main 包mydomain.com以及rsc.io/quote和io包进行分析;因为 mydomain.com/greetings没有具体列出,所以它将被排除在配置文件之外,即使它位于主模块中。

  • 运行覆盖检测的二进制文件

用&ldquo;&rdquo;构建的二进制-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未设置环境变量,覆盖检测的二进制文件仍将正确执行,但会发出警告。

来源:https://juejin.cn/post/7206568194465726525

标签:编程语言,内建顺序,构建
0
投稿

猜你喜欢

  • 如何查看access数据库中各元素的最大容量

    2007-08-28 12:44:00
  • 总结python 三种常见的内存泄漏场景

    2023-02-18 16:37:49
  • php中json_decode()和json_encode()的使用方法

    2023-06-11 16:31:56
  • Pytorch使用MNIST数据集实现基础GAN和DCGAN详解

    2021-11-17 02:14:33
  • Python网站验证码识别

    2023-09-11 04:29:36
  • pyqt5对用qt designer设计的窗体实现弹出子窗口的示例

    2023-01-28 12:58:07
  • opencv读取视频并保存图像的方法

    2023-02-21 17:30:16
  • Oracle 游标使用总结

    2009-10-02 17:36:00
  • 浅议 Web 网页 Form 表单设计技巧

    2007-10-09 13:05:00
  • 10个杀手级应用的Python自动化脚本

    2023-10-06 14:01:53
  • PHP实现的注册,登录及查询用户资料功能API接口示例

    2024-04-30 08:50:18
  • Python3.4解释器用法简单示例

    2022-01-04 10:30:39
  • sql分类汇总及Select的自增长脚本

    2012-07-21 14:40:14
  • SQLServer2008新实例远程数据库链接问题(sp_addlinkedserver)

    2024-01-19 23:44:22
  • python opencv进行图像拼接

    2022-09-10 16:13:01
  • MySQL中修改库名的操作教程

    2024-01-22 19:19:22
  • 详解JS深拷贝与浅拷贝

    2024-05-22 10:40:40
  • python 中的np.zeros()和np.ones()函数详解

    2023-01-14 10:23:58
  • Python进行区间取值案例讲解

    2021-10-23 15:17:34
  • Python实现读取字符串按列分配后按行输出示例

    2023-08-07 19:39:14
  • asp之家 网络编程 m.aspxhome.com