Skip to content

Commit 52c3fcb

Browse files
committed
chore: update README.md
1 parent f55a75e commit 52c3fcb

File tree

5 files changed

+190
-196
lines changed

5 files changed

+190
-196
lines changed

README.md

Lines changed: 110 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Go语言快速入门
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"
8590
GOBIN=""
91+
GOCACHE="/Users/wangchujiang/Library/Caches/go-build"
92+
GOENV="/Users/wangchujiang/Library/Application Support/go/env"
8693
GOEXE=""
87-
GOHOSTARCH="amd64"
94+
GOEXPERIMENT=""
95+
GOFLAGS=""
96+
GOHOSTARCH="arm64"
8897
GOHOSTOS="darwin"
98+
GOINSECURE=""
99+
GOMODCACHE="/Users/wangchujiang/go/pkg/mod"
100+
GONOPROXY=""
101+
GONOSUMDB=""
89102
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"
94112
GCCGO="gccgo"
113+
AR="ar"
95114
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"
97115
CXX="clang++"
98116
CGO_ENABLED="1"
117+
GOMOD="/dev/null"
118+
GOWORK=""
99119
CGO_CFLAGS="-g -O2"
100120
CGO_CPPFLAGS=""
101121
CGO_CXXFLAGS="-g -O2"
102122
CGO_FFLAGS="-g -O2"
103123
CGO_LDFLAGS="-g -O2"
104124
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"
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
456450
package main
457451
import "fmt"
458452
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的新值
468462
}
469463
```
470464

@@ -994,21 +988,21 @@ int val = a[2][3]
994988
package main
995989
import "fmt"
996990
type Vertex struct {
997-
X int
998-
Y int
991+
X int
992+
Y int
999993
}
1000994
func 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
14641458
import "fmt"
14651459
func 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
}

example/defer/defer.go

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11
package main
22
import "fmt"
33
func main() {
4-
// 2. 在输出 world
5-
defer fmt.Println("world")
6-
// 1. 先输出 hello
7-
fmt.Println("hello")
8-
// 输出结果
9-
// =======
10-
// hello
11-
// world
4+
// 2. 在输出 world
5+
defer fmt.Println("world")
6+
// 1. 先输出 hello
7+
fmt.Println("hello")
8+
// 输出结果
9+
// =======
10+
// hello
11+
// world
1212

1313

14-
fmt.Println("counting")
15-
for i := 0; i < 10; i++ {
16-
defer fmt.Println(i)
17-
}
18-
fmt.Println("done")
19-
// 输出结果
20-
// =======
21-
// counting
22-
// done
23-
// 9
24-
// 8
25-
// 7
26-
// 6
27-
// 5
28-
// 4
29-
// 3
30-
// 2
31-
// 1
32-
// 0
14+
fmt.Println("counting")
15+
for i := 0; i < 10; i++ {
16+
defer fmt.Println(i)
17+
}
18+
fmt.Println("done")
19+
// 输出结果
20+
// =======
21+
// counting
22+
// done
23+
// 9
24+
// 8
25+
// 7
26+
// 6
27+
// 5
28+
// 4
29+
// 3
30+
// 2
31+
// 1
32+
// 0
3333
}

0 commit comments

Comments
 (0)