golang.go 13 KB

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