-
Notifications
You must be signed in to change notification settings - Fork 2k
/
golang.go
310 lines (257 loc) · 12.6 KB
/
golang.go
1
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
/*******************************************************************************
* Golang CHEATSHEET (中文速查表) - by chlins (created on 2018/02/14)
* Version: 3, Last Modified: 2018/03/07 19:51
* https://github.com/skywind3000/awesome-cheatsheets
******************************************************************************/
/******************************************************************************
* Go 编译器命令
*****************************************************************************/
go command [arguments] // go 命令 [参数]
go build // 编译包和依赖包
go clean // 移除对象和缓存文件
go doc // 显示包的文档
go env // 打印go的环境变量信息
go bug // 报告bug
go fix // 更新包使用新的api
go fmt // 格式规范化代码
go generate // 通过处理资源生成go文件
go get // 下载并安装包及其依赖
go install // 编译和安装包及其依赖
go list // 列出所有包
go run // 编译和运行go程序
go test // 测试
go tool // 运行给定的go工具
go version // 显示go当前版本
go vet // 发现代码中可能的错误
/*******************************************************************************
* ENV
*******************************************************************************/
GOOS // 编译系统
GOARCH // 编译arch
GO111MODULE // gomod开关
GOPROXY // go代理 https://goproxy.io https://goproxy.cn
GOSSAFUNC // 生成SSA.html文件,展示代码优化的每一步 GOSSAFUNC=func_name go build
/*******************************************************************************
* Module
*******************************************************************************/
go mod init // 初始化当前文件夹,创建go.mod文件
go mod download // 下载依赖的module到本地
go mod tidy // 增加缺少的module,删除无用的module
go mod vendor // 将依赖复制到vendor下
文件go.mod // 依赖列表和版本约束
文件go.sum // 记录module文件hash值,用于安全校验
/*******************************************************************************
* 基本数据类型
*******************************************************************************/
bool // 布尔
string // 字符串
int // 无符号整型(32位操作系统上为int32,64位操作系统上为int64)
int8 // 8位无符号整型
int16 // 16位无符号整型
int32 // 32位无符号整型
int64 // 64位无符号整型
uint // 有符号整型(32位操作系统上为uint32,64位操作系统上为uint64)
uint8 // 8位有符号整型
uint16 // 16位有符号整型
uint32 // 32位有符号整型
uint64 // 64位有符号整型
float32 // 32位浮点数,精确到小数点后7位
float64 // 64位浮点数,精确到小数点后15位
complex64 // 32位实数和虚数
complex128 // 64位实数和虚数
byte // 类型实际是一个uint8,代表了ASCII码的一个字符
rune // 类型实际是一个int32,代表一个UTF-8字符
/*******************************************************************************
* Hello World
******************************************************************************/
// main.go
package main // 包名
import "fmt" // 导入fmt包
func main() { // 主函数
fmt.Println("Hello World") // 打印输出
}
// go run main.go // 直接运行
// go build && ./main // 先编译成二进制文件再运行
/*******************************************************************************
* 操作符
******************************************************************************/
// 算数操作符
+ - * / % // 加 减 乘 除 取余
& | ^ &^ // 位与 位或 位异或 位与非
<< >> // 左移 右移
// 比较操作
== != // 等于 不等于
< <= // 小于 小于等于
> >= // 大于 大于等于
// 逻辑操作
&& || ! // 逻辑与 逻辑或 逻辑非
// 其他
& * <- // 地址 指针引用 通道操作
/*******************************************************************************
* 声明
******************************************************************************/
a := 1 // 直接给一个未声明的变量赋值
var b int // var 变量名 数据类型 来声明
var c float64
// 注意:使用var声明过的变量不可再使用 := 赋值
a = 2
const d = 1 // 常量
/*******************************************************************************
* 数据类型
******************************************************************************/
s := "hello" // 字符
a := 1 // int
b := 1.2 // float64
c := 1 + 5i // complex128
// 数组
arr1 := [3]int{4, 5, 6} // 手动指定长度
arr2 := [...]int{1, 2, 3} // 由golang自动计算长度
// 切片
sliceInt := []int{1, 2} // 不指定长度
sliceByte := []byte("hello")
// 指针
a := 1
point := &a // 将a的地址赋给point
/*******************************************************************************
* 流程控制
******************************************************************************/
// for
i := 10
for i > 0 {
println(i--)
}
// if else
if i == 10 {
println("i == 10")
} else {
println("i != 10")
}
// if with init
m := map[int]int{1:1}
if v, ok := m[1]; ok {
println(v)
}
// switch
switch i {
case 10:
println("i == 10")
default:
println("i != 10")
}
// 三目表达式
注意:Golang没有三目表达式
/*******************************************************************************
* 函数
******************************************************************************/
// 以func关键字声明
func test() {}
f := func() {println("Lambdas function")} // 匿名函数
f()
func get() (a,b string) { // 函数多返回值
return "a", "b"
}
a, b := get()
/*******************************************************************************
* 结构体
******************************************************************************/
// golang中没有class只有struct
type People struct {
Age int // 大写开头的变量在包外可以访问
name string // 小写开头的变量仅可在本包内访问
}
p1 := People{25, "Kaven"} // 必须按照结构体内部定义的顺序
p2 := People{name: "Kaven", age: 25} // 若不按顺序则需要指定字段
// 也可以先不赋值
p3 := new(People)
p3.Age = 25
p3.name = "Kaven"
/*******************************************************************************
* 方法
******************************************************************************/
// 方法通常是针对一个结构体来说的
type Foo struct {
a int
}
// 值接收者
func (f Foo) test() {
f.a = 1 // 不会改变原来的值
}
// 指针接收者
func (f *Foo) test() {
f.a = 1 // 会改变原值
}
/*******************************************************************************
* go 协程
******************************************************************************/
go func() {
time.Sleep(10 * time.Second)
println("hello")
}() // 不会阻塞代码的运行 代码会直接向下运行
// channel 通道
c := make(chan int)
// 两个协程间可以通过chan通信
go func() {c <- 1}() // 此时c会被阻塞 直到值被取走前都不可在塞入新值
go func() {println(<-c)}()
// 带缓存的channel
bc := make(chan int, 2)
go func() {c <- 1; c <-2}() // c中可以存储声明时所定义的缓存大小的数据,这里是2个
go func() {println(<-c)}()
/*******************************************************************************
* 接口
******************************************************************************/
// go的接口为鸭子类型,即只要你实现了接口中的方法就实现了该接口
type Reader interface {
Reading() // 仅需实现Reading方法就实现了该接口
}
type As struct {}
func (a As) Reading() {} // 实现了Reader接口
type Bs struct {}
func (b Bs) Reading() {} // 也实现了Reader接口
func (b Bs) Closing() {}
/*******************************************************************************
* 泛型(v1.18)
******************************************************************************/
func Sum[T int | float32 | float64](x, y T) T {
return x + y
}
type Number interface {
int | int32 | int64 | float64 | float32
}
type SliceAdditon[T Number] struct {
data []T
}
func (sa *SliceAdditon[T]) Sum() T {
var sum T
for _, v := range sa.data {
sum += v
}
return sum
}
func Caller() {
sInt := Sum(1, 2) // Sum[int]
sFloat := Sum(1.1, 2.2) // Sum[float64]
println(sInt, sFloat)
saInt := SliceAdditon[int]{data: []int{1, 2, 3, 4, 5}}
saFloat64 := SliceAdditon[float64]{data: []float64{1.1, 2.2, 3.3, 4.4, 5.5}}
println(saInt.Sum())
println(saFloat64.Sum())
}
/*******************************************************************************
* 一些推荐
******************************************************************************/
// 入门书籍
《Go学习笔记》 // 雨痕的
《Go语言实战》 // 强烈推荐
// 网上资料
https://github.com/astaxie/build-web-application-with-golang // 谢大的
https://github.com/Unknwon/the-way-to-go_ZH_CN // 无闻
https://github.com/Unknwon/go-fundamental-programming // 无闻教学视频
// 第三方类库
https://golanglibs.com/
// 大杂烩
https://github.com/avelino/awesome-go
/*******************************************************************************
* References
******************************************************************************/
https://github.com/a8m/go-lang-cheat-sheet
https://github.com/LeCoupa/awesome-cheatsheets