Go环境以及IDE安装配置简记
# 前言
最近了解计算机底层原理时需要接触go语言,查阅网上资料找到一款比较的IDEA GoLand,所以以这篇文章记录一下笔者的安装过程。
# 安装步骤
# 下载并安装Go
首先我们需要到Go官网下载Go dev,地址如下:
https://go.dev/dl/ (opens new window)
因为笔者用的时windows系统,所以选择windows系统,下载完成后解压安装即可

安装go编译器后,它会自动帮我配置环境变量,所以完成安装后我们直接在cmd输入一下go,如果可以看到下图中的提示即可说明安装成功:

# 下载GoLand 2023.1.4并安装
完成编译器安装之后,就可以开始安装IDEA,我们首先到GoLand官网下载,地址如下:
https://www.jetbrains.com/go/download/#section=windows (opens new window)
如下图,直接点击下载即可,完成后点击安装退出,后续就要进行破解步骤了。

# 基础配置和使用
# 翻译插件安装
阅读源码时可能会用到翻译插件,这里先下载这个插件然后改为百度翻译即可。

# GoRoot配置
然后将GoRoot设置为go编译器的路径。

# GoPath配置
GoPath配置为你后续存放项目的路径,并勾选下面两个选项。

# 运行
然后我们随便编写一段代码
// 将go程序都组织成包
package main
//导入fmt包,fmt是标准的输出库
import "fmt"
// main函数,程序执行的入口
func main() {
fmt.Println("hello go")
}
2
3
4
5
6
7
8
9
10
11
点击运行,如果可以看到输出结果则说明基本配置是成功的。

可选项:
如果你希望能够指定输出目录的话,可以通过edit configuration来调整,还是以上面的代码为例,找到goLand的配置按钮

选择输出目录,当前go文件编译后的文件就会在这个out目录下。

再次运行我们就会看到,编译后的文件出现在该位置。

# 编译环境
# 简介与配置
有时候我们希望用go编译指令来排查一些问题,在Windows环境下并没有GCC编译器,对此我们首先需要下载一个MinGW-w64,下载地址如下:
完成后我们会得到这样一个文件,首先我们将其解压

然后得到mingw64的文件,并将其移动到你认为合适的目录。

最后将该文件的bin目录配置到环境变量下,重启电脑即可

# 测试
我们现在有一段线程不安全的代码,我们希望能够定位到协程竞争的代码段,如果使用命令行,我们可以需要在go文件下运行:
CGO_ENABLED=1 go build -race
注:当CGO_ENABLED=1, 进行编译时, 会将文件中引用libc的库(比如常用的net包),以动态链接的方式生成目标文件。 当CGO_ENABLED=0, 进行编译时, 则会把在目标文件中未定义的符号(外部函数)一起链接到可执行文件中。
func main() {
//设置计数器为协程数2
wg.Add(2)
//启动两个协程对counter进行自增
go incCounter(1)
go incCounter(2)
//等待两个协程执行完
wg.Wait()
fmt.Println("执行完毕,counter:", counter)
}
func incCounter(id int) {
//函数执行完成后 计数器减1
defer wg.Done()
//fmt.Println("协程", id, "开始工作")
for i := 0; i < 2; i++ {
value := counter
//fmt.Println("协程", id, "读取到的counter:", counter)
//将协程对应的线程执行权归还,并回到队列中
runtime.Gosched()
value++
//fmt.Println("协程", id, "覆盖counter值,value:", value)
counter = value
//fmt.Println("协程", id, "完成value自增,自增后的值为", value)
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
由于上文我们已经完成所有编译环境的配置,使用GoLand在edit configurations下即可完成上述命令行的配置:

最后运行时输出下面这样的结果,我们即可在堆栈调用信息中定位到有问题的代码段:
WARNING: DATA RACE
Write at 0x00000063c508 by goroutine 7:
main.incCounter()
F:/github/code/chapter6/listing09/listing09.go:49 +0xa4
main.main.func1()
F:/github/code/chapter6/listing09/listing09.go:25 +0x30
Previous read at 0x00000063c508 by goroutine 8:
main.incCounter()
F:/github/code/chapter6/listing09/listing09.go:40 +0x84
main.main.func2()
F:/github/code/chapter6/listing09/listing09.go:26 +0x30
Goroutine 7 (running) created at:
main.main()
F:/github/code/chapter6/listing09/listing09.go:25 +0x44
Goroutine 8 (finished) created at:
main.main()
F:/github/code/chapter6/listing09/listing09.go:26 +0x50
==================
Final Counter: 2
Found 1 data race(s)
Process finished with the exit code 66
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 参考文献
【go】CreateProcess error=216, 该版本的 %1 与你运行的 Windows 版本不兼容。:https://blog.csdn.net/my_miuye/article/details/103706162 (opens new window)
Windows下配置Golang开发环境,并安装配置GoLand IDE | 青训营笔记:https://juejin.cn/post/7192609260470009914#heading-1 (opens new window)
GoLand安装+破解:https://www.cnblogs.com/yingxu/p/17456123.html (opens new window)
go 编译时,环境变量CGO_ENABLED的作用: https://www.jianshu.com/p/bc78c32db030 (opens new window)
Go使用Goland的go build的配置: https://blog.csdn.net/xiaopengshen/article/details/121363188 (opens new window)