iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >go语言构建顺序源码分析
  • 846
分享到

go语言构建顺序源码分析

2023-07-05 09:07:33 846人浏览 安东尼
摘要

这篇文章主要介绍“Go语言构建顺序源码分析”,在日常操作中,相信很多人在go语言构建顺序源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言构建顺序源码分析”的疑惑有所帮助!接下来,请跟着小编一起来

这篇文章主要介绍“Go语言构建顺序源码分析”,在日常操作中,相信很多人在go语言构建顺序源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言构建顺序源码分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    1 构建 顺序

    依据词法名顺序 当导入一个包,且这个包 定义了 init(), 那么导入时init()将被执行。

    具体执行顺序: 全局变量定义时的函数

        import 执行导入 -> cont 执行常量        --> var 执行变量 --> 执行初始化 init() --> 执行 main()----> mainimport pk1  --->  pk1const ...import pk2  --->   pkg2var ...const ...import pk3  ---> pk3init()var ...const...const...main()init()var...vat.........init()...init()...exit

    示例:

    package mainimport "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 testinit internal/bytealg @0.008 ms, 0 ms clock, 0 bytes, 0 allocsinit runtime @0.059 ms, 0.026 ms clock, 0 bytes, 0 allocsinit math @0.19 ms, 0.001 ms clock, 0 bytes, 0 allocsinit errors @0.22 ms, 0.004 ms clock, 0 bytes, 0 allocsinit strconv @0.24 ms, 0.002 ms clock, 32 bytes, 2 allocsinit sync @0.28 ms, 0.003 ms clock, 16 bytes, 1 allocsinit 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.goCGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build  -o bin/main.exe ./cmd/dend-server/main.go

    1.2 设置

    Mac Mac下编译Linux, Windows平台的64位可执行程序:

    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.goCGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go

    Linux Linux下编译Mac, Windows平台的64位可执行程序:

    CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.goCGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go

    Windows Windows下编译Mac, Linux平台的64位可执行程序:

    cmd:

    set GOARCH=amd64go env -w GOPATH=amd64set GOOS = linuxgo env -w GOOS=linux

    还原:

    set GOARCH=amd64go env -w GOARCH=cmd64set GOOS=windowsgo 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.modmodule mydomain.comgo 1.20require rsc.io/quote v1.5.2require (    golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect    rsc.io/sampler v1.3.0 // indirect)$ cat myprogram.gopackage mainimport (    "fmt"    "mydomain.com/greetings"    "rsc.io/quote")func main() {    fmt.Printf("I say %q and %q\n", quote.Hello(), greetings.Goodbye())}$ cat greetings/greetings.gopackage greetingsfunc 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.exeI say "Hello, world." and "see ya"$ ls somedatacovcounters.c6de772f99010ef5925877a7b05db4cc.2424989.1670252383678349347covmeta.c6de772f99010ef5925877a7b05db4cc$

    请注意写入目录的两个文件somedata:这些(二进制)文件包含覆盖率结果。

    如果GOCOVERDIR未设置环境变量,覆盖检测的二进制文件仍将正确执行,但会发出警告。

    到此,关于“go语言构建顺序源码分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: go语言构建顺序源码分析

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

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

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • go语言构建顺序源码分析
      这篇文章主要介绍“go语言构建顺序源码分析”,在日常操作中,相信很多人在go语言构建顺序源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言构建顺序源码分析”的疑惑有所帮助!接下来,请跟着小编一起来...
      99+
      2023-07-05
    • Go语言进阶freecache源码分析
      这篇文章主要介绍“Go语言进阶freecache源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言进阶freecache源码分析”文章能帮助大家解决问题。00. 什么是 freecach...
      99+
      2023-07-06
    • Go语言context test源码分析详情
      目录1.测试例子分析2.单元测试1.测试例子分析 example_test.go,展示了With-系列的4个例子 func ExampleWithCancel() {   gen :...
      99+
      2022-11-13
    • Go语言io pipe源码分析详情
      目录1.结构分析2.pipe sruct分析3.PipeReader对外暴露的是读/关闭4.写法5.总结pipe.go分析: 这个文件使用到了errors包,也是用到了sync库.文...
      99+
      2022-11-13
    • MySQL之SQL语法及SQL解析顺序源码分析
      这篇“MySQL之SQL语法及SQL解析顺序源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看...
      99+
      2023-04-06
      mysql sql
    • 对Go语言中的context包源码分析
      目录一、包说明分析二、包结构分析三、Context接口类型分析四、后续分析规划五、基于实现类型到常用函数六、With-系列函数七、扩展功能以及如何扩展八、补充一、包说明分析 cont...
      99+
      2022-11-13
    • Go语言读写锁RWMutex的源码分析
      目录前言RWMutex 总览深入源码数据结构RLock()RUnlock()Lock()Unlock()常见问题实战一下前言 在前面两篇文章中 初见 Go Mutex&nb...
      99+
      2022-11-11
    • 如何分析Go语言的库源码文件
      这期内容当中小编将会给大家带来有关如何分析Go语言的库源码文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。go适合做什么go是golang...
      99+
      2022-10-19
    • Go语言网络编程与Http源码分析
      这篇文章主要介绍“Go语言网络编程与Http源码分析”,在日常操作中,相信很多人在Go语言网络编程与Http源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言网络编程与Http源码分析”的疑惑有所...
      99+
      2023-07-05
    • 怎么进行Go语言HTTP Server源码分析
      这期内容当中小编将会给大家带来有关怎么进行Go语言HTTP Server源码分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Go语言中HTTP Server:HTTP  server,顾名思义...
      99+
      2023-06-17
    • Go 语言结构实例分析
      当前的调试部分可以使用 go run filename.go 来执行。 可以生成一个 build.sh 脚本,用于在指定位置产生已编译好的 可执文件: #!/usr/bin/en...
      99+
      2022-11-12
    • go语言字符类型byte与rune源码分析
      这篇文章主要介绍“go语言字符类型byte与rune源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言字符类型byte与rune源码分析”文章能帮助大家解决问题。一、byte类型介绍by...
      99+
      2023-07-05
    • Go语言结构的示例分析
      这篇文章主要为大家展示了“Go语言结构的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Go语言结构的示例分析”这篇文章吧。当前的调试部分可以使用 go run filename.go 来...
      99+
      2023-06-20
    • C语言经典顺序表实例分析
      这篇“C语言经典顺序表实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言经典顺序表实例分析”文章吧。1、移除元素题...
      99+
      2023-06-30
    • Go语言中Struct、继承、匿名字段和内嵌结构体源码分析
      这篇文章主要介绍“Go语言中Struct、继承、匿名字段和内嵌结构体源码分析”,在日常操作中,相信很多人在Go语言中Struct、继承、匿名字段和内嵌结构体源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
      99+
      2023-07-06
    • 语言编程花絮内建构建顺序示例详解
      目录1 构建 顺序1.1 交叉编译1.2 设置2 构建测试支持1 构建 顺序 依据词法名顺序 当导入一个包,且这个包 定义了 init(), 那么导入时init()将被执行。 具体...
      99+
      2023-03-06
      编程语言内建构建顺序 编程语言内建
    • go语言分布式id生成器及分布式锁源码分析
      本文小编为大家详细介绍“go语言分布式id生成器及分布式锁源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言分布式id生成器及分布式锁源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。分布式 i...
      99+
      2023-07-05
    • Go语言运算符与控制结构实例代码分析
      这篇文章主要讲解了“Go语言运算符与控制结构实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言运算符与控制结构实例代码分析”吧!运算符运算符的作用是将操作数组合成表达式,比如...
      99+
      2023-07-05
    • C语言线性表中顺序表的示例分析
      小编给大家分享一下C语言线性表中顺序表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、本章重点线性表和顺序表的概念动态和静态顺序表接口实现在线0j训练...
      99+
      2023-06-29
    • mysql代码执行结构实例分析【顺序、分支、循环结构】
      本文实例讲述了mysql代码执行结构。分享给大家供大家参考,具体如下: 本文内容: 什么是代码执行结构 顺序结构 分支结构 循环结构  首发日期:2018-04-18 什么是代码执行结...
      99+
      2022-05-22
      mysql 代码执行结构 顺序 分支 循环
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作