Go语言的编译与工具

Go语言--编译与工具 1 编译工具 Go语言的工具链非常丰富,从获取源码、编译、文档、测试、性能分析,到源码格式化、源码提示、重构工具等应有尽有。 在Go语言中可以使用测试框架编写单元测试,使用统一的命令行即可测试及输出测试报告的工作。基准测试提供可自定义的计时器和一整套基准测试算法,能方便快速地分析一段代码可能存在的CPU耗用和内存分配问题。性能分析工具可以将程序的CPU耗用、内存分配、竞态问题以图形化方式展现出来。 1.1 编译(go build) Go语言中使用 go build 命令将.go源码编译为可执行文件。g 阅读详情

一、编译(go build)

1、go build无参数编译

两个文件在同一个文件夹(gobuild)

main.go代码如下:

package main

import (
	"fmt"
)

func main() {
	pkgFunc()
	fmt.Println("hello worlds")
}

lib.go代码如下:

package main

import (
	"fmt"
)

func pkgFunc() {
	fmt.Println("call pakFunc")
}

输入命令行如下:

go build

输入命令行如下:

ls

运行结果如下:

gobuild lib.go  main.go

输入命令行如下:

./gobuild

运行结果如下:

call pakFunc
hello worlds

2、go build+文件列表

格式如下:

go build file1.go file2.go……

代码如下:

$ go build main.go lib.go
$ ls
lib.go main main.go
$ ./main
call pkgFunc
hello world
$ go build lib.go main.go
$ ls
lib lib.go main main.go

如果需要指定输出可执行文件名,可以使用-o参数,参见下面的例子:

$ go build -o myexec main.go lib.go
$ ls
lib.go main.go myexec
$ ./myexec
call pkgFunc
hello world

上面代码中,在go build和文件列表之间插入了-o myexec参数,表示指定输出文件名为myexec。

3、go build+包

一个文件夹(goinstall)里有一个文件(main.go)和一个文件夹(mypkg)。一个文件夹(mypkg)里有一个文件(mypkg.go)。

main.go代码如下:

package main

import (
	"fmt"
	"test/goinstall/mypkg"
)

func main() {
	mypkg.CustomPkgFunc()
	fmt.Println("hello world")
}

mypkg.go代码如下:

package mypkg

import "fmt"

func CustomPkgFunc() {
	fmt.Println("call CustomPkgFunc")
}

执行以下命令将按包方式编译goinstall代码:

douxiaobodeMac-mini:goinstall douxiaobo$ go build -o main test/goinstall
douxiaobodeMac-mini:goinstall douxiaobo$ ls
main    main.go mypkg
douxiaobodeMac-mini:goinstall douxiaobo$ ./main
call CustomPkgFunc
hello world

4、go build编译时的附加参数

go build编译时的附加参数
附加参数备注
-v编译时显示包名
-p n开启并发编译,默认有情况下该值为CPU逻辑核数
-a强制重新构建
-n打印编译时会用到的所有命令,但不真正执行
-x打印编译时会用到的所有命令
-race开启竞态检测

二、编译后运行(go run)

代码如下:

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println("args:", os.Args)
}

运行结果如下:

PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\Go> go run main.go --filename xxx.go
args: [C:\Users\A-XIAO~1\AppData\Local\Temp\go-build69443624\b001\exe\main.exe --filename xxx.go]

三、编译并安装(go install)

四、一键获取代码、编译并安装(go get)

1、远程包的路径格式

网站域名/作者或机构/项目名

2、go get + 远程包

默认情况下,go get可以直接使用。

3、go get使用时的附加参数

go get使用时的附加参数
附加参数备注
-v显示操作流程的日志及信息,方便检查错误
-u下载丢失的包,但不会更新已经存在的包
-d只下载,不安装
-insecure允许使用

五、测试(go test)

1、单元测试——测试和验证代码的框架

func TestXXX( t *testing.T)

helloworld_test.go的代码如下:

package go_test

import "testing"

func TestHelloWorld(t *testing.T) {
	t.Log("Hello world")
}

1)单元测试命令行

运行结果如下:

PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\Go> go test helloworld_test.go
ok      command-line-arguments  0.373s
PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\Go> go test -v helloworld_test.go
=== RUN   TestHelloWorld
    helloworld_test.go:6: Hello world
--- PASS: TestHelloWorld (0.00s)
PASS
ok      command-line-arguments  0.261s

2)运行指定单元测试用例

代码如下:

package go_test

import "testing"

func TestA(t *testing.T) {
	t.Log("A")
}

func TestAK(t *testing.T) {
	t.Log("AK")
}

func TestB(t *testing.T) {
	t.Log("B")
}

func TestC(t *testing.T) {
	t.Log("C")
}

运行结果如下:

PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\Go> go test -v -run TestA select_test.go
=== RUN   TestA
    select_test.go:6: A
--- PASS: TestA (0.00s)
=== RUN   TestAK
    select_test.go:10: AK
--- PASS: TestAK (0.00s)
PASS
ok      command-line-arguments  0.308s

3)标记单元测试结果

代码如下:

package go_test

import (
	"fmt"
	"testing"
)

func TestFailNow(t *testing.T) {
	t.FailNow()
}

func TestFail(t *testing.T) {
	fmt.Println("before fail")
	t.Fail()
	fmt.Println("after fail")
}

运行结果如下:

PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\Go> go test -v fail_test.go
=== RUN   TestFailNow
--- FAIL: TestFailNow (0.00s)
=== RUN   TestFail
before fail
after fail
--- FAIL: TestFail (0.00s)
FAIL
FAIL    command-line-arguments  0.261s
FAIL

4)单元测试日志

单元测试框架提供的日志方法
方法备注
Log打印日志,同时结束测试
Logf格式化打印日志,同时结束测试
Error打印错误日志,同时结束测试
Errorf格式化打印错误日志,同时结束测试
Fatal打印致命日志,同时结束测试
Fatalf格式化打印致命日志,同时结束测试。

2、基准测试——获得代码内存占用和运行效率的性能数据

1)基础测试基本使用

代码如下:

package go_test

import "testing"

func Benchmark_Add(b *testing.B) {
	var n int
	for i := 0; i < b.N; i++ {
		n++
	}
}

运行结果如下:

PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\Go> go test -v -bench="." benchmark_test.go
goos: windows
goarch: amd64
cpu: Intel(R) Core(TM) i7-7660U CPU @ 2.50GHz
Benchmark_Add
Benchmark_Add-4         1000000000               0.4225 ns/op
PASS
ok      command-line-arguments  0.728s

在Linux和Mac,go test -v -bench=. benchmark_test.go

在Windows下使用go test命令行时,-bench=.应写为-bench="."。

2)基准测试原理

3)自定义测试时间

运行结果如下:

PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\Go> go test -v -bench="." -benchtime=5s benchmark_test.go
goos: windows
goarch: amd64
cpu: Intel(R) Core(TM) i7-7660U CPU @ 2.50GHz
Benchmark_Add
Benchmark_Add-4         1000000000               0.2612 ns/op
PASS
ok      command-line-arguments  0.546s

4)测试内存

代码如下:

package go_test

import "testing"

func Benchmark_Alloc(b *testing.B) {
	for i := 0; i < b.N; i++ {
		fmt.Sprintf("%d", i)
	}
}

运行结果如下:

PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\Go> go test -v -bench=Alloc -benchmen benchmark_test.go
go: go.mod file not found in current directory or any parent directory; see 'go help modules'

5)控制计时器

代码如下:

package go_test

import "testing"

func Benchmark_Add_TimerControl(b *testing.B) {
	//重置计时器
	b.ResetTimer()
	//停止计时器
	b.StopTimer()
	//开始计时器
	b.StartTimer()
	var n int
	for i := 0; i < b.N; i++ {
		n++
	}
}

六、性能分析(go pprof)——发现代码性能问题的调用位置

1、安装第三方图形化显示分析数据工具(Graphviz)

www . graphviz . org

CentOS下,可以使用yum指令直接安装:

yum install graphiviz

2、安装第三方性能分析来分析代码包

go get github.com/pkg/profile

3、性能分析代码

基准测试:cup.go,代码如下:

package main

import (
	"time"

	"github.com/pkg/profile"
)

func joinSlice() []string {
	var arr []string
	for i := 0; i < 10000; i++ {
		//故意造成很多次的切片添加(append)操作,由于每次操作可有会有内存重新分配和移动,性能较低
		arr = append(arr, "arr")
	}
	return arr
}

func main() {
	//开始性能分析,返回一个停止接口
	stopper := profile.Start(profile.CPUProfile, profile.ProfilePath("."))
	//在main()结束时停止性能分析
	defer stopper.Stop()
	//分析的核心逻辑
	joinSlice()
	//让程序至少运行1秒
	time.Sleep(time.Second)
}

书上说:

$ go build -o cpu cpu.go

$ ./cup

$ go tool pprof --pdf cup cup.pprof > cup.pdf

func joinSlice() []string {
	const count = 100000
	var arr []string = make([]string, count)
	for i := 0; i < count; i++ {
		arr[i] = "arr"
	}
	return arr
}

go的编译以及运行时环境 很多语言都有自己的运行时环境,go自然也不例外,那么今天我们就来讲讲go语言的运行时环境!注意💡:编译过程都干了些啥事可以去看看编译原理,中间码是平台无关的,机器码是平台相关的!我们都知道Java的运行时环境是jvm ,javascript的运行时环境是浏览器内核。,Runtime与用户程序没有明显界限,直接通过函数调用!那么go的运行时环境是什么样呢?说明编译的时候自带运行环境。这样就屏蔽了系统调用! 阅读详情

相关推荐

Go语言反编译工具 | 快速解密Go程序的源代码

然而,值得注意的是,反编译工具并不能保证100%的精确度,反编译后的代码可能会缺少注释或者变量命名也会变得不那么直观。使用这些工具时,开发者只需将Go程序的二进制文件导入工具,工具便会自动进行分析,并恢复出Go语言的源代码。虽然反编译后的代码可能不完全与原始代码一致,但通常可以帮助开发者理解程序的功能和结构,尤其在进行程序漏洞分析或进行法律层面的代码审核时特别有用。其次,了解游戏的基本结构非常重要。总之,Go语言反编译工具是开发者进行代码分析和学习的重要工具,尤其在没有源代码的情况下。

voicts_736的博客 582

Go程序是如何编译并运行起来的(图文详解)

Go程序开发进阶保姆级教程,图文详解Go的编译和运行,深入体会Go程序的启动全过程

一枚coder的精进(荆棘)之路 4149

GO语言基础教程(188)Go编译与测试工具:Go工具链实战秘籍:编译测试一网打尽

本文深入介绍Go语言编译与测试工具链,涵盖go build、go run基础编译命令和gofmt、goimports代码格式化工具。详细讲解原生testing框架、Testify增强工具及基准测试、模糊测试等高级用法,并推荐CompileDaemon热重载工具提升开发效率。通过完整示例展示如何集成这些工具到实际项目中,助你打造更整洁、健壮的Go代码,显著提升开发效率。

jxf_jxfcsdn的博客 629

Go的编译和运行

一Golang执行流程分析 1 对源码先编译再执行,Go的执行流程如下图。 2对源码直接执行 gorun源码,Go的执行流程如下图。 二两种执行流程的区别 1如果先编译生成了可执行文件,那么可以将该执行文件拷贝到没有go开发环境的机器商,仍然可以运行。 2如果是直接gorungo源代码,那么如果要在另外一台机器上运行,那么另外一台机器也必须安装go开发环境,否则无法执行。 3在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变大了...

实践求真知 8933

GO语言基础教程(191)Go编译与测试工具之go run命令:深度解析Go语言go run命令:编译运行的快捷之道

本文深度解析Go语言中go run命令的使用方法与内部机制,涵盖基本用法、参数传递、多文件处理等实战场景,并揭示其临时编译的幕后秘密。通过对比go build与go run的区别,帮助开发者根据实际需求灵活选择编译方式,提升开发效率与调试体验。

jxf_jxfcsdn的博客 619

Go 学习笔记(37)— 标准命令行工具(go build 跨平台编译、交叉编译、go clean、go run、go fmt、go install、go get、go vet)

1. 标准命令简述 Go 本身包含来大量用于处理 Go 程序的命令和工具。 命令 作用 build 用于编译指定的代码包或 Go 语言源码文件。命令源码文件会被编译成可执行文件,并存放到命令执行的目录或指定目录下。而库源码文件被编译后,则不会在非临时目录中留下任何文件。 clean 用于清除因执行其他 go 命令而遗留下来的临时目录和文件。 doc 用于显示打印 Go 语言代码包以及程序实体的文档。 env 用于打印 Go 语言相关的环境信息。 fix 用于修正指定代码的

wohu1104的专栏 9801

【软件工具】go语言的编译工具使用的是吗,gcc吗?go编译的时候用的是 make build命令

Go编译器:Go语言使用自己提供的编译器(如gc),无需依赖GCC或其他外部编译器。go build命令:直接用于编译Go项目,不需要通过make或Makefile,除非项目有额外的构建需求。make和Makefile:在Go项目中可以使用,但不是必需品。主要用于复杂的构建流程或多步骤任务。通过Go的内置工具链,开发者可以直接而高效地编译、运行和管理Go项目。

weixin_46453070的博客 2014

Go 语言的工具链:从编译到调试

Go 语言的工具链涵盖了从代码编写到部署的整个开发流程,为开发者提供了全方位的支持。通过熟练掌握 Go 编译器、调试器、性能分析工具等的使用方法,开发者可以显著提高开发效率,编写出高质量、高性能的 Go 程序。随着 Go 语言的不断发展,其工具链也将持续完善,为开发者带来更多便利。

数字魔方操控师的博客 265

Go语言反编译工具: 深入理解Go语言反编译的技术与应用

反编译工具用于将编译后的Go程序(通常是二进制文件)转回源代码,以帮助开发者理解程序的工作原理,或者在某些情况下,恢复丢失的源代码。在实际应用中,三菱PLC的编程不仅限于控制简单的开关动作,随着自动化技术的进步,许多先进的控制任务,如伺服控制、机器人控制等,也可以通过PLC编程来实现。在这种情况下,反编译工具能帮助开发者从二进制文件中恢复出可用的代码,尽管恢复的代码可能没有原始代码那么完美,但它依然能提供开发者所需的基础。通过不断的学习和实验,工程师们可以掌握编程技巧,提高系统的可靠性与生产效率。

vuauod_353的博客 634

Go语言跨平台开发:交叉编译工具链解析

在云计算、边缘计算和物联网快速发展的今天,软件开发需要面对多样化的硬件架构和操作系统环境。Go语言凭借其简洁的语法、高效的并发模型和原生的跨平台支持,成为构建分布式系统、微服务和高性能工具的首选语言之一。本文聚焦Go语言的交叉编译能力,详细解析其工具链的工作原理、配置方法及实际应用,帮助开发者实现“一次编写,随处编译”的高效开发模式。背景与核心概念:定义交叉编译关键术语,解析Go工具链架构编译原理与环境配置:讲解编译流程、环境变量及工具链组件实战案例:通过具体项目演示多平台编译过程。

AI Agent Harness Engineering 1470

UG/NX二次开发实战:用Python脚本批量更新100个零件参数,解放你的双手

本文详细介绍了如何利用NXOpen Python API进行UG/NX二次开发,实现批量更新100个零件参数的自动化流程。通过环境配置、框架设计、核心代码实现及性能优化,帮助工程师高效完成参数化设计任务,显著提升工作效率。

weixin_28694169的博客 276

【软件工具】Go语言的编译工具并不使用GCC或其他外部编译器

Go编译器:Go语言使用自己提供的编译器(如gc),无需依赖GCC或其他外部编译器。go build命令:直接用于编译Go项目,不需要通过make或Makefile,除非项目有额外的构建需求。make和Makefile:在Go项目中可以使用,但不是必需品。主要用于复杂的构建流程或多步骤任务。通过Go的内置工具链,开发者可以直接而高效地编译、运行和管理Go项目。

weixin_46453070的博客 1320

有限状态机FSM详解(一)

有限状态机在维基百科中的解释是: 有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 至于为什么要学FSM,FSM可以把模型的多状态、多状态间的转换条件解耦。可以使维护变得容易,代码也更加具有可读性,也更加艺术。 理解有限状态机首先需要理解整个模型。我们把灯的开关作为示例,...

benjonc的博客 5万+

Go语言反编译工具 | 如何有效使用Go语言反编译工具进行代码分析

常见的Go语言反编译工具包括`goredis`、`gogoproc`、`GoReSym`等,这些工具通过分析Go语言的二进制文件,提取其中的函数、变量、结构体等信息,帮助开发者了解程序的工作原理和结构。然而,随着Go语言程序的复杂性增加,如何反编译Go语言编写的程序、分析其代码和进行逆向工程,成为了开发者和安全研究人员需要面对的一个问题。在实际应用中,三菱PLC的编程不仅限于控制简单的开关动作,随着自动化技术的进步,许多先进的控制任务,如伺服控制、机器人控制等,也可以通过PLC编程来实现。

mfnart_282的博客 327

uniapp无感刷新token实现过程

可以看到已经触发了刷新token接口,并且重新请求上次失败的列表接口,无感刷新token逻辑已经正常,但为什么列表接口请求成功,还一直loading没关闭捏,就是因为后续代码未执行,await接口的返回没有成功resolve。路漫漫其修远兮,前端道路逐渐迷茫,时隔好久好久终于想起了我还有一个小博客,最近在一直在弄uniapp,属实有被恶心到,但也至少会用了,最近实现了一个比较通用的功能,就是无感刷新token,但在过程中发现一个问题就是。3、排查await的列表接口为何没有成功resolve。

weixin_40618068的博客 3594

学习笔记|多组率卡方检验和Fisher确切法|个案加权|规范表达|《小白爱上SPSS》课程:SPSS第十六讲 | 多组率卡方检验和Fisher确切法

学习笔记|多组率卡方检验和Fisher确切法|个案加权|规范表达|《小白爱上SPSS》课程:SPSS第十六讲 | 多组率卡方检验和Fisher确切法

Medlar_CN的博客 2962

Go语言使用的编译器 | 探索Go编程语言的工具链和编译过程

Go语言的主要编译器是`gc`,它是Go官方自带的编译器,也是最常用的编译器。首先,Go语言的编译器具有强大的并行编译能力,它能够快速编译大规模的代码库,尤其适用于需要高性能的应用程序。其次,Go语言的工具链提供了丰富的命令,例如`go run`用于直接运行Go程序,`go test`用于执行单元测试,`go fmt`用于自动格式化代码等,这些工具极大地提高了开发效率。总的来说,Go语言的编译器是其工具链中不可或缺的一部分,它不仅确保了Go程序能够高效运行,也为开发者提供了简洁而强大的开发体验。

qmhjwh_290的博客 460

Win10 + Linux 双系统删除(Linux)

删除Linux所使用的磁盘分区 进入此电脑->计算机->管理->磁盘管理

weixin_52247624的博客 944

Go语言学习笔记(十)Go语言编译与工具

Go语言的工具链非常丰富,从获取源码、编译、文档、测试、性能分析,到源码格式化、源码提示、重构工具应有尽有。 1.go build         Go语言中使用go build命令将源码编译为可执行文件。 (1)go build无参数编译         在main包所在目录下使用go build命令进行编译,生成当前目录名的可执行文件。 (2)go build + 文件列表    ...

kang___xi的博客 497

BugkuCTF-PWN题pwn2-overflow超详细讲解

解题思路 1)计算出get_shell_的地址偏移量 2)算出来之后就直接溢出到后门函数 知识点 x64函数调用规则 解题之前我们先学下linux x64的函数调用规则。 x64机器在调用某个函数前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他会把前6个参数从左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余参数存入到栈里,保存的顺序是从右往左入栈。比如abcdef会存入到寄存器里,然后一次入栈h

am_03的博客 3013

SKUA-GOCAD入门教程-第七节 点的创建与编辑3

本文介绍了四种从井数据创建点集的方法

江洋大葱的博客 963

第12章 Go语言编译和工具链

Go 语言的工具链非常丰富,从获取源码、编译、文档、测试、性能分析,到源码格式化、源码提示、重构工具等应有尽有。 在 Go 语言中可以使用测试框架编写单元测试,使用统一的命令行即可测试及输出测试报告的工作。基准测试提供可自定义的计时器和一套基准测试算法,能方便快速地分析一段代码可能存在的 CPU 耗用和内存分配问题。性能分析工具可以将程序的 CPU 耗用、内存分配、竞态问题以图形化方式展现出来。 本章内容: 12.1go build命令(go语言编译命令)完全攻略 Go语言的编译速度非常快。Go..

心情第一 1049

TSP:车为什么能和云端交互?

TSP:车为什么能和云端交互?

天赐好车的博客 412

Go语言交叉编译工具gox

基本介绍 交叉编译是为了在不同平台编译出其他平台的程序,比如在Linux编译出Windows程序,在Windows能编译出Linux程序,32位系统下编译出64位程序,今天介绍的gox就是其中一款交叉编译工具。 配置环境 首先配置好Go语言的环境变量,并在~/.bash_profile中设置,简单说明一下为什么要添加至该文件,首先以下代码在终端执行完成后只对当前会话有效,关闭终端变量就失效了,而....

weixin_33721344的博客 429

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

go语言编译可执行文件双击怎么显示信息_Go:我的 CLI 工具新语言

过去的一两周里,被公司的大佬安利了 Go,用来写一个代码、架构分析和自动化重构的工具。经过这么一周对于 Go 语言的实战,我算是有底气来写一篇文章来介绍(吐槽)一下 Go 语言。优点 1:跨平台支持(交叉编译)对于习惯了创造轮子的我而言,起先我觉得使用 Go,又或者是其它语言并没有多大的区别。直到我看到了,大佬在 macOS 下构建出了 Windows、GNU/Linux 和 macOS 等系统的...

weixin_29713403的博客 339

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: Go语言的列表(list)
下一篇: Go语言的“避坑”与技巧
DXB2021
博客等级 码龄5年 307粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值