这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
- 了解go语言的特性
- 保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率
- 从 C 语言中继承了如表达式语法、控制结构
- 垃圾回收机制
- 包的概念
- 天然并发
- 吸收了管道通信机制,形成 Go 语言特有的管道
- 函数返回多个值
- 保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率
基础语法
运行
- go run 命令直接进行编译和与运行
- go build 命令先编译生成二进制文件,再直接使用相应文件名运行
变量&常量
- go 是一门强类型语言
- 变量声明方式:
- 使用 var + 变量名 + 赋值
- 使用 变量名 := 赋值(推导类型)
-
var num int \\只是声明了变量并未赋值 num = 10 \\给 num 变量赋值 num:=10 \\此时go语言会自动根据赋值识别变量类型
- 常量声明方式:
- 将 var 改为 const
语句
- if else:没有括号,如果写了括号在编译器运行的时候会自动去掉括号,但是注意不可以写到同一行,只能是大括号
- 循环:只有 for 循环,没有 dowhile 或是 while 循环
- 什么都不写代表一个死循环
- 在 for 后面跟有声明变量,判断条件和执行语句后可以进行符合条件的循环
- switch:
- 不会出现 case 穿透现象
- switch 后面的变量名不需要括号
- 可以使用任何数据类型,包括字符串和结构体,可以取代任何 if-else 语句
- 数组:
- 使用var + 变量名称 + [数组长度] + 变量类型
-
var num[5] int \\声明了一个 int 类型的 num 数组,长度为5
- 切片:
- 任意长度的数组,可以随时变更
- 使用 make 创建一个切片
-
var slice1 []type = make([]type, length, capacity) var num []int = make([]int,5,10) - 此处说明一下切片的长度(length)和容量(capacity)的区别
- 切片的长度表示元素的个数
- 切片的容量更接近于一个警戒值,如果长度等于容量了,切片就会自动进行扩容
- 在声明的时候可以省略切片的容量,如果缺省那么切片的容量就会默认等于切片的长度
- append 是将结果赋值为原数组,语法为 append(切片变量名,element...)
- slice 原理为一个长度 + 一个容量 + 一个指向数组的指针,如果容量不够,append 会进行扩容并返回新的 slice
- 切片返回相应的子串,[a,b] 代表从 a 下表到 b-1 下标的元素,如果省略不写代表取到末尾为止
- map:
- 使用 m:= make(map[键类型]值类型)或 m2:= map[key 类型]value 类型{"key":value...} 声明并创建 map
- 使用 m[key]=value 进行赋值
- 使用 var1,var2 = m[key] 对两个 var1 和 var2 进行赋值
- 使用 delete(map变量名,key) 删除特定键值对
- range:
- 对于 map 或数组可以快速使用 range 遍历
- 遍历的时候使用两个变量分别保存数组或 map 的下标(key)和值(value),如果只声明一个那就只保存 key
- 函数:
- 参数的变量类型是后置的
- 指针:
- 可以修改相应地址空间的值
- 要使用的时候需要加上一个 & 符号,实际使用的时候需要加一个 *
-
func query(word* string) \\此时代表word是被指针指向引用的 query(&word) \\此时表示word是指针,此时传入word在函数内如果发生修改,则可以实际修改word的内容,如果没有&,那么就无法直接修改word
-
- 结构体:
- 使用 type + 结构体名字 + struct 来声明
- 内部的变量使用变量名 + 类型
- 使用结构体的时候需要传入每个字段的初始值或只指定一部分的初始值
- 对于结构体变量可以使用 .变量名的形式对结构体进行修改
- 如果将方法的结构体参数变量放到 func 关键字后面,方法名前面,该方法就成为一个结构体方法,此时调用该方法可以直接通过结构体变量名.方法名使用该方法
- 错误处理
- 单独作为一个变量返回,如果没有错误需要返回 nil
- 对于有返回错误的函数,需要写两个变量
- 字符串格式化
- 可以使用 %v 打印任何变量
- 使用 %+v 得到更加详细的结构,#v 得到更加详细的结构
- JSON:
- 对于已有的结构体将变量名字首字符改为大写即可,然后可以使用 json.Marshal 函数进行序列化
- 对于序列化的数组,直接打印会输出十六进制的编码,需要进行 string 转换