-
-
Notifications
You must be signed in to change notification settings - Fork 458
/
golang.go
230 lines (184 loc) · 8.62 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
/*******************************************************************************
* 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 // 发现代码中可能的错误
/*******************************************************************************
* 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")
}
// switch
switch i {
case 10:
println("i == 10")
default:
println("i != 10")
}
/*******************************************************************************
* 函数
******************************************************************************/
// 以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() {}
/*******************************************************************************
* 一些推荐
******************************************************************************/
// 入门书籍
《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