4
4
<!-- idoc:ignore:end-->
5
5
6
6
[ ![ CI] ( https://github.com/jaywcjlove/golang-tutorial/actions/workflows/ci.yml/badge.svg )] ( https://github.com/jaywcjlove/golang-tutorial/actions/workflows/ci.yml )
7
+ ![ golang v1.18.3] ( https://img.shields.io/static/v1?label=&message=Golang%201.18.3&color=blue&logo=go&logoColor=white )
7
8
8
9
通过简单的例子,来快速入门Go语言基础编程、语法等各种语言特性,主要面向新手级别的学习者。下面所有例子均来源于网络,看文需谨慎后果自负。
9
10
@@ -22,6 +23,7 @@ Go语言快速入门
22
23
---
23
24
24
25
- [ 安装Go] ( #安装go )
26
+ - [ 卸载Go] ( #卸载go )
25
27
- [ 运行Go] ( #运行go )
26
28
- [ 格式化输入输出] ( #格式化输入输出 )
27
29
- [ 编程基础] ( #编程基础 )
@@ -48,10 +50,12 @@ yum install golang
48
50
``` bash
49
51
# 源码下载
50
52
# 官网源码 https://golang.org/dl/ 需要翻墙
51
- wget https://storage.googleapis.com/golang/go1.9.darwin-amd64.pkg
52
- tar zxvf go1.8.linux-amd64.tar.gz -C /usr/local
53
- # 新建GOPATH目录
54
- mkdir -p $HOME /gopath
53
+ wget https://storage.googleapis.com/golang/go1.18.3.linux-amd64.tar.gz
54
+ $ rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz
55
+ ```
56
+
57
+ ``` bash
58
+ export PATH=$PATH :/usr/local/go/bin
55
59
```
56
60
57
61
### Mac中通过brew命令安装
@@ -81,27 +85,44 @@ brew upgrade go # 更新 go
81
85
``` bash
82
86
→ go env
83
87
84
- GOARCH=" amd64"
88
+ GO111MODULE=" "
89
+ GOARCH=" arm64"
85
90
GOBIN=" "
91
+ GOCACHE=" /Users/wangchujiang/Library/Caches/go-build"
92
+ GOENV=" /Users/wangchujiang/Library/Application Support/go/env"
86
93
GOEXE=" "
87
- GOHOSTARCH=" amd64"
94
+ GOEXPERIMENT=" "
95
+ GOFLAGS=" "
96
+ GOHOSTARCH=" arm64"
88
97
GOHOSTOS=" darwin"
98
+ GOINSECURE=" "
99
+ GOMODCACHE=" /Users/wangchujiang/go/pkg/mod"
100
+ GONOPROXY=" "
101
+ GONOSUMDB=" "
89
102
GOOS=" darwin"
90
- GOPATH=" /Users/kenny/go"
91
- GORACE=" "
92
- GOROOT=" /usr/local/Cellar/go/1.9/libexec"
93
- GOTOOLDIR=" /usr/local/Cellar/go/1.9/libexec/pkg/tool/darwin_amd64"
103
+ GOPATH=" /Users/wangchujiang/go"
104
+ GOPRIVATE=" "
105
+ GOPROXY=" https://proxy.golang.org,direct"
106
+ GOROOT=" /usr/local/go"
107
+ GOSUMDB=" sum.golang.org"
108
+ GOTMPDIR=" "
109
+ GOTOOLDIR=" /usr/local/go/pkg/tool/darwin_arm64"
110
+ GOVCS=" "
111
+ GOVERSION=" go1.18.3"
94
112
GCCGO=" gccgo"
113
+ AR=" ar"
95
114
CC=" clang"
96
- GOGCCFLAGS=" -fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/j7/3xly5sk567s65ny5dnr__3b80000gn/T/go-build377856897=/tmp/go-build -gno-record-gcc-switches -fno-common"
97
115
CXX=" clang++"
98
116
CGO_ENABLED=" 1"
117
+ GOMOD=" /dev/null"
118
+ GOWORK=" "
99
119
CGO_CFLAGS=" -g -O2"
100
120
CGO_CPPFLAGS=" "
101
121
CGO_CXXFLAGS=" -g -O2"
102
122
CGO_FFLAGS=" -g -O2"
103
123
CGO_LDFLAGS=" -g -O2"
104
124
PKG_CONFIG=" pkg-config"
125
+ GOGCCFLAGS=" -fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/rn/jv6_kn5j2wv1whyj3pqvpxbw0000gn/T/go-build947462154=/tmp/go-build -gno-record-gcc-switches -fno-common"
105
126
```
106
127
107
128
如果需要修改默认的环境变量配置修改 ` vim ~/.bash_profile ` 或者 ` vim ~/.zshrc `
@@ -131,85 +152,59 @@ source /etc/profile
131
152
132
153
``` bash
133
154
→ go --help
134
- Go is a tool for managing Go source code.
135
- Go是用于管理Go源代码的工具。
136
-
137
- Usage用法:
138
- go command [arguments]
139
-
140
- The commands are:
141
-
142
- build 命令用于编译我们指定的源码文件或代码包以及它们的依赖包。
143
- -o 指定输出的文件名,可以带上路径,例如 go build -o a/b/c
144
- -i 安装相应的包,编译+go install
145
- -a 更新全部已经是最新的包的,但是对标准包不适用
146
- -n 把需要执行的编译命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的
147
- -p n 指定可以并行可运行的编译数目,默认是CPU数目
148
- -race 开启编译的时候自动检测数据竞争的情况,目前只支持64位的机器
149
- -v 打印出来我们正在编译的包名
150
- -work 打印出来编译时候的临时文件夹名称,并且如果已经存在的话就不要删除
151
- -x 打印出来执行的命令,其实就是和-n的结果类似,只是这个会执行
152
- -ccflags ' arg list' 传递参数给5c, 6c, 8c 调用
153
- -compiler name 指定相应的编译器,gccgo还是gc
154
- -gccgoflags ' arg list' 传递参数给gccgo编译连接调用
155
- -gcflags ' arg list' 传递参数给5g, 6g, 8g 调用
156
- -installsuffix suffix 为了和默认的安装包区别开来,采用这个前缀来重新安装那些依赖的包,-race的时候默认已经是-installsuffix race,大家可以通过-n命令来验证
157
- -ldflags ' flag list' 传递参数给5l, 6l, 8l 调用
158
- -tags ' tag list' 设置在编译的时候可以适配的那些tag,详细的tag限制参考里面的http://golang.org/pkg/go/build/
159
- clean 删除掉执行其它命令时产生的一些文件和目录。
160
- -i 清除关联的安装的包和可运行文件,也就是通过go install安装的文件
161
- -n 把需要执行的清除命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的
162
- -r 循环的清除在import中引入的包
163
- -x 打印出来执行的详细命令,其实就是-n打印的执行版本
164
- doc 命令可以打印附于Go语言程序实体上的文档。
165
- env 用于打印Go语言的环境信息。
166
- bug 启动错误报告。
167
- fix 把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。
168
- fmt 在包源上运行gofmt。
169
- -l 显示那些需要格式化的文件
170
- -w 把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出。
171
- -r 添加形如“a[b:len(a)] -> a[b:]”的重写规则,方便我们做批量替换
172
- -s 简化文件中的代码
173
- -d 显示格式化前后的diff而不是写入文件,默认是false
174
- -e 打印所有的语法错误到标准输出。如果不使用此标记,则只会打印不同行的前10个错误。
175
- -cpuprofile 支持调试模式,写入相应的cpufile到指定的文件
176
- generate 通过处理源生成Go文件。
177
- get 下载或更新安装指定的代码包及其依赖包,并对它们进行编译和安装。
178
- -d 只下载不安装
179
- -f 只有在你包含了-u参数的时候才有效,不让-u去验证import中的每一个都已经获取了,这对于本地fork的包特别有用
180
- -fix 在获取源码之后先运行fix,然后再去做其他的事情
181
- -t 同时也下载需要为运行测试所需要的包
182
- -u 强制使用网络去更新包和它的依赖包
183
- -v 显示执行的命令
184
- install 用于编译并安装指定的代码包及它们的依赖包。
185
- list 列出指定的代码包的信息。
186
- run 命令可以编译并运行命令源码文件。
187
- test 对Go语言编写的程序进行测试。
188
- -bench regexp 执行相应的benchmarks,例如 -bench=.
189
- -cover 开启测试覆盖率
190
- -run regexp 只运行regexp匹配的函数,例如 -run=Array 那么就执行包含有Array开头的函数
191
- -v 显示测试的详细命令
192
- tool 运行指定的go工具
193
- go tool fix . 用来修复以前老版本的代码到新版本,例如go1之前老版本的代码转化到go1,例如API的变化
194
- go tool vet directory| files 用来分析当前目录的代码是否都是正确的代码,例如是不是调用fmt.Printf里面的参数不正确,例如函数里面提前return了然后出现了无用代码之类的。
195
- version 打印Go的版本信息
196
- vet 用于检查Go语言源码中静态错误的简单工具。
197
-
198
- Use " go help [command]" for more information about a command.
199
-
200
- Additional help topics:
201
-
202
- c calling between Go and C
203
- buildmode description of build modes
204
- filetype file types
205
- gopath GOPATH environment variable
206
- environment environment variables
207
- importpath import path syntax
208
- packages description of package lists
209
- testflag description of testing flags
210
- testfunc description of testing functions
211
-
212
- Use " go help [topic]" for more information about that topic.
155
+
156
+ Go 是一个管理 Go 源代码的工具。
157
+
158
+ 用法:
159
+
160
+ go < command> [arguments]
161
+
162
+ 命令是:
163
+
164
+ bug 开始一个错误报告。 start a bug report
165
+ build 编译包和依赖。 compile packages and dependencies
166
+ clean 删除目标文件和缓存文件。 remove object files and cached files
167
+ doc 显示包或符号的文档。 show documentation for package or symbol
168
+ env 打印Go环境信息。 print Go environment information
169
+ fix 更新软件包以使用新的 API。 update packages to use new APIs
170
+ fmt gofmt(重新格式化)包源。 gofmt (reformat) package sources
171
+ generate 通过处理源生成 Go 文件。 generate Go files by processing source
172
+ get 将依赖项添加到当前模块并安装它们。 add dependencies to current module and install them
173
+ install 编译和安装包和依赖项。 compile and install packages and dependencies
174
+ list 列出包或模块。 list packages or modules
175
+ mod 模块维护。 module maintenance
176
+ work 工作空间维护。 workspace maintenance
177
+ run 编译并运行 Go 程序。 compile and run Go program
178
+ test 测试包。 test packages
179
+ tool 运行指定的 go 工具。 run specified go tool
180
+ version 打印 Go 版本。 print Go version
181
+ vet 报告包中可能出现的错误。 report likely mistakes in packages
182
+
183
+ 使用“go help < command> ”获取有关命令的更多信息。
184
+
185
+ 其他帮助主题:
186
+
187
+ buildconstraint 构建约束。 build constraints
188
+ buildmode 构建模式。 build modes
189
+ c Go 和 C 之间的调用。 calling between Go and C
190
+ cache 构建和测试缓存。 build and test caching
191
+ environment 环境变量。 environment variables
192
+ filetype 文件类型。 file types
193
+ go.mod go.mod 文件。 the go.mod file
194
+ gopath GOPATH 环境变量。 GOPATH environment variable
195
+ gopath-get 遗留的 GOPATH 去获取。 legacy GOPATH go get
196
+ goproxy 模块代理协议。 module proxy protocol
197
+ importpath 导入路径语法。 import path syntax
198
+ modules 模块、模块版本等。 modules, module versions, and more
199
+ module-get 模块感知 go get。 module-aware go get
200
+ module-auth 使用 go.sum 进行模块认证。 module authentication using go.sum
201
+ packages 包装清单和模式。 package lists and patterns
202
+ private 下载非公开代码的配置。 configuration for downloading non-public code
203
+ testflag 测试标志。 testing flags
204
+ testfunc 测试功能。 testing functions
205
+ vcs 使用 GOVCS 控制版本控制。 controlling version control with GOVCS
206
+
207
+ Use " go help <topic>" for more information about that topic.
213
208
```
214
209
215
210
其它命令
@@ -264,8 +259,7 @@ govendor test +local
264
259
265
260
- 删除 Go 的安装文件目录,这通常是在 ` Linux ` ,` macOS ` 和 ` FreeBSD ` 下的 ` /usr/local/ ` go 或者在 Windows 下的 ` c:\Go ` 下。
266
261
- 同时删除环境变量, ` Linux ` 和 ` FreeBSD ` 编辑 ` /etc/profile ` 或者 ` $HOME/.profile ` 。
267
- - 如果你是 ` macOS ` 你需要删除 ` /etc/paths.d/go ` 文件。
268
-
262
+ - 如果你是 ` macOS ` 你需要删除 ` /etc/paths.d/go ` ,` /usr/local/go ` 文件。
269
263
270
264
## 运行Go
271
265
@@ -456,15 +450,15 @@ fmt.Println(*p) // 通过指针 p 读取 i
456
450
package main
457
451
import " fmt"
458
452
func main () {
459
- i , j := 42 , 2701
460
- p := &i // 指向我 i
461
- fmt.Println (*p) // 通过指针读 i
462
- *p = 21 // 通过指针设置 i
463
- fmt.Println (i) // 看到i的新值
464
-
465
- p = &j // 指向我 j
466
- *p = *p / 37 // 通过指针划分 j
467
- fmt.Println (j) // 看到j的新值
453
+ i , j := 42 , 2701
454
+ p := &i // 指向我 i
455
+ fmt.Println (*p) // 通过指针读 i
456
+ *p = 21 // 通过指针设置 i
457
+ fmt.Println (i) // 看到i的新值
458
+
459
+ p = &j // 指向我 j
460
+ *p = *p / 37 // 通过指针划分 j
461
+ fmt.Println (j) // 看到j的新值
468
462
}
469
463
```
470
464
@@ -994,21 +988,21 @@ int val = a[2][3]
994
988
package main
995
989
import " fmt"
996
990
type Vertex struct {
997
- X int
998
- Y int
991
+ X int
992
+ Y int
999
993
}
1000
994
func main () {
1001
995
fmt.Println(Vertex{1, 2})
1002
996
1003
997
// 结构体字段使用点号来访问。
1004
- v := Vertex{1, 2}
1005
- v.X = 4
998
+ v := Vertex{1, 2}
999
+ v.X = 4
1006
1000
fmt.Println(v.X)
1007
1001
1008
1002
// 结构体字段可以通过结构体指针来访问。
1009
- e := Vertex{1, 2}
1010
- p := & e
1011
- p.X = 1e9
1003
+ e := Vertex{1, 2}
1004
+ p := & e
1005
+ p.X = 1e9
1012
1006
fmt.Println(e)
1013
1007
1014
1008
@@ -1454,8 +1448,8 @@ func main() {
1454
1448
| 运算符 | 描述 | 实例 |
1455
1449
| ---- | ---- | ---- |
1456
1450
| && | 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 | (A && B) 为 False |
1457
- | \|\| | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。| (A || B) 为 True |
1458
- | ! | 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | ! (A && B) 为 True |
1451
+ | \|\| | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。| (A || B) 为 True |
1452
+ | ! | 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | ! (A && B) 为 True |
1459
1453
1460
1454
# ## 位运算符
1461
1455
@@ -1464,8 +1458,8 @@ package main
1464
1458
import " fmt"
1465
1459
func main () {
1466
1460
1467
- var a uint = 60 /* 60 = 0011 1100 * /
1468
- var b uint = 13 /* 13 = 0000 1101 * /
1461
+ var a uint = 60 /* 60 = 0011 1100 * /
1462
+ var b uint = 13 /* 13 = 0000 1101 * /
1469
1463
var c uint = 0
1470
1464
1471
1465
c = a & b /* 12 = 0000 1100 * /
@@ -1489,9 +1483,9 @@ Go 语言支持的位运算符如下表所示。假定 A 为60,B 为13:
1489
1483
1490
1484
| 运算符 | 描述 | 实例 |
1491
1485
| ---- | ---- | ---- |
1492
- | & | 按位与运算符" &" 是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (A & B) 结果为 12, 二进制为 0000 1100 |
1493
- | \| | 按位或运算符 \| 是双目运算符。 其功能是参与运算的两数各对应的二进位相或。 | (A \| B) 结果为 61, 二进制为 0011 1101 |
1494
- | ^ | 按位异或运算符" ^" 是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 | (A ^ B) 结果为 49, 二进制为 0011 0001 |
1486
+ | & | 按位与运算符" &" 是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (A & B) 结果为 12, 二进制为 0000 1100 |
1487
+ | \| | 按位或运算符 \| 是双目运算符。 其功能是参与运算的两数各对应的二进位相或。 | (A \| B) 结果为 61, 二进制为 0011 1101 |
1488
+ | ^ | 按位异或运算符" ^" 是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 | (A ^ B) 结果为 49, 二进制为 0011 0001 |
1495
1489
| << | 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | A << 2 结果为 240 ,二进制为 1111 0000 |
1496
1490
| >> | 右移运算符" >>" 是双目运算符。右移n位就是除以2的n次方。 其功能是把" >>" 左边的运算数的各二进位全部右移若干位," >>" 右边的数指定移动的位数。| A >> 2 结果为 15 ,二进制为 0000 1111 |
1497
1491
@@ -1569,7 +1563,7 @@ func main() {
1569
1563
fmt.Printf(" 第 3 行 - c 变量类型为 = %T\n" , c ); // 第 3 行 - c 变量类型为 = float32
1570
1564
1571
1565
/* & 和 * 运算符实例 * /
1572
- ptr = & a /* ' ptr' 包含了 ' a' 变量的地址 * /
1566
+ ptr = & a /* ' ptr' 包含了 ' a' 变量的地址 * /
1573
1567
fmt.Printf(" a 的值为 %d\n" , a); // a 的值为 4
1574
1568
fmt.Printf(" *ptr 为 %d\n" , * ptr); // * ptr 为 4
1575
1569
}
0 commit comments