44<!-- idoc:ignore:end-->
55
66[ ![ 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 )
78
89通过简单的例子,来快速入门Go语言基础编程、语法等各种语言特性,主要面向新手级别的学习者。下面所有例子均来源于网络,看文需谨慎后果自负。
910
@@ -22,6 +23,7 @@ Go语言快速入门
2223---
2324
2425- [ 安装Go] ( #安装go )
26+ - [ 卸载Go] ( #卸载go )
2527- [ 运行Go] ( #运行go )
2628- [ 格式化输入输出] ( #格式化输入输出 )
2729- [ 编程基础] ( #编程基础 )
@@ -48,10 +50,12 @@ yum install golang
4850``` bash
4951# 源码下载
5052# 官网源码 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
5559```
5660
5761### Mac中通过brew命令安装
@@ -81,27 +85,44 @@ brew upgrade go # 更新 go
8185``` bash
8286→ go env
8387
84- GOARCH=" amd64"
88+ GO111MODULE=" "
89+ GOARCH=" arm64"
8590GOBIN=" "
91+ GOCACHE=" /Users/wangchujiang/Library/Caches/go-build"
92+ GOENV=" /Users/wangchujiang/Library/Application Support/go/env"
8693GOEXE=" "
87- GOHOSTARCH=" amd64"
94+ GOEXPERIMENT=" "
95+ GOFLAGS=" "
96+ GOHOSTARCH=" arm64"
8897GOHOSTOS=" darwin"
98+ GOINSECURE=" "
99+ GOMODCACHE=" /Users/wangchujiang/go/pkg/mod"
100+ GONOPROXY=" "
101+ GONOSUMDB=" "
89102GOOS=" 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"
94112GCCGO=" gccgo"
113+ AR=" ar"
95114CC=" 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"
97115CXX=" clang++"
98116CGO_ENABLED=" 1"
117+ GOMOD=" /dev/null"
118+ GOWORK=" "
99119CGO_CFLAGS=" -g -O2"
100120CGO_CPPFLAGS=" "
101121CGO_CXXFLAGS=" -g -O2"
102122CGO_FFLAGS=" -g -O2"
103123CGO_LDFLAGS=" -g -O2"
104124PKG_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"
105126```
106127
107128如果需要修改默认的环境变量配置修改 ` vim ~/.bash_profile ` 或者 ` vim ~/.zshrc `
@@ -131,85 +152,59 @@ source /etc/profile
131152
132153``` bash
133154→ 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.
213208```
214209
215210其它命令
@@ -264,8 +259,7 @@ govendor test +local
264259
265260- 删除 Go 的安装文件目录,这通常是在 ` Linux ` ,` macOS ` 和 ` FreeBSD ` 下的 ` /usr/local/ ` go 或者在 Windows 下的 ` c:\Go ` 下。
266261- 同时删除环境变量, ` Linux ` 和 ` FreeBSD ` 编辑 ` /etc/profile ` 或者 ` $HOME/.profile ` 。
267- - 如果你是 ` macOS ` 你需要删除 ` /etc/paths.d/go ` 文件。
268-
262+ - 如果你是 ` macOS ` 你需要删除 ` /etc/paths.d/go ` ,` /usr/local/go ` 文件。
269263
270264## 运行Go
271265
@@ -456,15 +450,15 @@ fmt.Println(*p) // 通过指针 p 读取 i
456450package main
457451import " fmt"
458452func 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的新值
468462}
469463```
470464
@@ -994,21 +988,21 @@ int val = a[2][3]
994988package main
995989import " fmt"
996990type Vertex struct {
997- X int
998- Y int
991+ X int
992+ Y int
999993}
1000994func main () {
1001995 fmt.Println(Vertex{1, 2})
1002996
1003997 // 结构体字段使用点号来访问。
1004- v := Vertex{1, 2}
1005- v.X = 4
998+ v := Vertex{1, 2}
999+ v.X = 4
10061000 fmt.Println(v.X)
10071001
10081002 // 结构体字段可以通过结构体指针来访问。
1009- e := Vertex{1, 2}
1010- p := & e
1011- p.X = 1e9
1003+ e := Vertex{1, 2}
1004+ p := & e
1005+ p.X = 1e9
10121006 fmt.Println(e)
10131007
10141008
@@ -1454,8 +1448,8 @@ func main() {
14541448| 运算符 | 描述 | 实例 |
14551449| ---- | ---- | ---- |
14561450| && | 逻辑 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 |
14591453
14601454# ## 位运算符
14611455
@@ -1464,8 +1458,8 @@ package main
14641458import " fmt"
14651459func main () {
14661460
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 * /
14691463 var c uint = 0
14701464
14711465 c = a & b /* 12 = 0000 1100 * /
@@ -1489,9 +1483,9 @@ Go 语言支持的位运算符如下表所示。假定 A 为60,B 为13:
14891483
14901484| 运算符 | 描述 | 实例 |
14911485| ---- | ---- | ---- |
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 |
14951489| << | 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | A << 2 结果为 240 ,二进制为 1111 0000 |
14961490| >> | 右移运算符" >>" 是双目运算符。右移n位就是除以2的n次方。 其功能是把" >>" 左边的运算数的各二进位全部右移若干位," >>" 右边的数指定移动的位数。| A >> 2 结果为 15 ,二进制为 0000 1111 |
14971491
@@ -1569,7 +1563,7 @@ func main() {
15691563 fmt.Printf(" 第 3 行 - c 变量类型为 = %T\n" , c ); // 第 3 行 - c 变量类型为 = float32
15701564
15711565 /* & 和 * 运算符实例 * /
1572- ptr = & a /* ' ptr' 包含了 ' a' 变量的地址 * /
1566+ ptr = & a /* ' ptr' 包含了 ' a' 变量的地址 * /
15731567 fmt.Printf(" a 的值为 %d\n" , a); // a 的值为 4
15741568 fmt.Printf(" *ptr 为 %d\n" , * ptr); // * ptr 为 4
15751569}
0 commit comments