返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >语言编程花絮内建构建顺序示例详解
  • 384
分享到

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

编程语言内建构建顺序编程语言内建 2023-03-06 14:03:53 384人浏览 安东尼
摘要

目录1 构建 顺序1.1 交叉编译1.2 设置2 构建测试支持1 构建 顺序 依据词法名顺序 当导入一个包,且这个包 定义了 init(), 那么导入时init()将被执行。 具体

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

以上就是语言编程花絮内建构建顺序示例详解的详细内容,更多关于编程语言内建构建顺序的资料请关注编程网其它相关文章!

--结束END--

本文标题: 语言编程花絮内建构建顺序示例详解

本文链接: https://lsjlt.com/news/198703.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 语言编程花絮内建构建顺序示例详解
    目录1 构建 顺序1.1 交叉编译1.2 设置2 构建测试支持1 构建 顺序 依据词法名顺序 当导入一个包,且这个包 定义了 init(), 那么导入时init()将被执行。 具体...
    99+
    2023-03-06
    编程语言内建构建顺序 编程语言内建
  • 怎么用Python编程语言构建内部网
    怎么用Python编程语言构建内部网,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。运行方式Python可以以命令行方式运行,也可以交互式方式运行,还具有图形集成环境,这样开...
    99+
    2023-06-17
  • C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解
    目录初始化尾插格局打开尾删初始化 在初步认识顺序表这一结构后,我们就可以继续深入探究这是我之前在.h文件中创建的结构体 typedef int type; typedef struc...
    99+
    2024-04-02
  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解
    目录头插操作头删操作小结头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作。 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没...
    99+
    2024-04-02
  • BlenderPython编程实现程序化建模生成超形示例详解
    目录正文什么是超形(Supershapes, Superformula)二维超形n1 = n2 = n3 = 1n1 = n2 = n3 = 0.3其他特别情况例子 1例子 2例子 ...
    99+
    2024-04-02
  • C语言实现顺序表的基本操作的示例详解
    目录一、认识顺序表1.线性表2.顺序表的概念及结构二、顺序表的基本操作(接口实现)1.初始化顺序表2.打印顺序表3.尾插4.尾删5.扩容6.头插7.头删8.任意位置插入9.任意位置删...
    99+
    2022-11-13
    C语言顺序表基本操作 C语言顺序表操作 C语言顺序表
  • C语言 超详细顺序表的模拟实现实例建议收藏
    目录概念及结构接口实现1 顺序表的动态存储2 顺序表初始化3 顺序表的销毁4 顺序表的尾插5 顺序表的尾删6 顺序表的头插7 顺序表的头删8 顺序表容量的检查与扩容9 顺序表任意位置...
    99+
    2024-04-02
  • C语言如何与ARM汇编语言混合编程示例详解
    目录一、ARM汇编语言简介二、C语言调用汇编语言1.无参数调用2.有参数调用三、汇编语言调用C语言四、总结五、参考文献主要使用软件:keiL μVision5 一、ARM汇编语言简介...
    99+
    2024-04-02
  • BlenderPython编程创建发光材质示例详解
    目录前言正文在 Python 脚本中创建一个着色器我们的想法具体代码与注释创建发光材质具体调用代码前言 Blender 并不是唯一一款允许你为场景编程和自动化任务的3D软件; 随着每...
    99+
    2024-04-02
  • Go语言数据结构之希尔排序示例详解
    目录希尔排序算法思想图解算法Go 代码实现:总结希尔排序 在插入排序中,在待排序序列的记录个数比较少,而且基本有序,则排序的效率较高。 1959 年,Donald ...
    99+
    2024-04-02
  • Go语言数据结构之选择排序示例详解
    目录选择排序动画演示Go 代码实现总结选择排序 选择排序(selection sort)是一种原地(in-place)排序算法,适用于数据量较少的情况。由于选择操作是基于键...
    99+
    2024-04-02
  • Go语言数据结构之插入排序示例详解
    目录插入排序动画演示Go 代码实现总结插入排序 插入排序,英文名(insertion sort)是一种简单且有效的比较排序算法。 思想: 在每次迭代过程中算法随机地从输入序...
    99+
    2024-04-02
  • C语言程序中结构体的内存对齐详解
    目录一、为什么存在内存对齐二、结构体的内存对齐四规则三、举例一、为什么存在内存对齐 1.平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某...
    99+
    2022-11-13
    C语言结构体内存对齐 C语言 内存对齐 C语言 结构体
  • C语言编程C++柔性数组结构示例讲解
    目录绕指柔—柔性数组柔性数组的特点:第一个好处是:方便内存释放第二个好处是:这样有利于访问速度总结绕指柔—柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概...
    99+
    2024-04-02
  • C语言编程大小端问题示例详解教程
    目录如何理解大小端大小端的基本概念大小端是如何影响数据的存取的今天想给大家分享的,是数据存储中的大小端问题,今天的分享主要分为三个部分,分别是如何理解大小端,大小端的基本概念以及大小...
    99+
    2024-04-02
  • go语言编程之select信道处理示例详解
    目录select信道处理fibonacci数列监听select监听协程select信道处理 注意:有default就不会阻塞 package main func main() { ...
    99+
    2024-04-02
  • go语言编程实现递归函数示例详解
    目录前言函数中的 return递归的问题总结前言 本篇文章主要是记录一下在 GScript 中实现递归调用时所遇到的坑,类似的问题在中文互联网上我几乎没有找到相关的内容,所以还是很有...
    99+
    2024-04-02
  • C语言编程C++动态内存分配示例讲解
    目录动态内存管理为什么存在动态内存分配动态内存函数的介绍malloc申请空间和free释放空间有借有还 free释放内存calloc申请内存realloc调整动态内存的大小reall...
    99+
    2024-04-02
  • C语言数据结构线性表教程示例详解
    目录线性表顺序表线性表 数据结构里我们时常看到什么什么表,线性表是最基本、最简单、也是最常用的一种数据结构,其他各种表的万恶之源就是这个线性表,他是个啥其实顾名思义: 一个线性表是n...
    99+
    2024-04-02
  • Go语言学习教程之结构体的示例详解
    目录前言可导出的标识符嵌入字段提升标签结构体与JSON相互转换结构体转JSONJSON转结构体练习代码步骤前言 结构体是一个序列,包含一些被命名的元素,这些被命名的元素称为字段(fi...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作