1. 变量申明
1.1 声明变量,默认值是0
1 | var a int |
1.2 通过值自动匹配当前的变量数据类型
1 | var b = 100 |
1.3 省去var(常用)
1 | c := 100 |
1.4 多行多变量声明
1 | var ( |
2. 常量声明
2.1 const
1 | const length int = 10 // 只读属性,不可以修改 |
2.2 iota(计算常量行数)
从0开始算,iota只能配合
const()
使用
1 | const ( |
3. 返回值
3.1 单返回值
1 | func foo1(a string, b string) int { |
3.2 匿名多返回值
1 | func foo2(a string, b string) (int, int){ |
3.3 形参名多返回值
1 | func foo3(a string, b string) (r1 int, r2 int){ |
4. 函数
4.1 导包
1 | import ( |
4.2 init构造函数
1 | func init(){ |
5. defer
defer用于函数体运行完前执行的代码 === final
相当于压栈,先入栈的defer后出,后入先出
1 | func main(){ |
6. 切片(数组)
silce是引用传递所以修改时会修改原属组的数据属性
6.1 demo
1 | myArray := []int{1,2,3,4,5} |
6.2 遍历
1 | for index, value := range myArray{ |
6.3 四种声明方式
6.3.1 声明且初始化
声明slice是一个切片,并且初始化
1 | slice := []int{1, 2, 3} |
6.3.2 声明但不初始化
声明slice是一个切片,但是不初始化,就没有空间,所以需要使用make方法动态开辟空间
1 | var slice []int |
6.3.2 简写声明和分配空间(常用)
1 | slice := make([]int, 3) |
6.4 追加元素
make()方法中加入两个参数,一个是初始化空间,一个是cap扩容空间(即每次扩容都按cap位自动扩容)
1 | var numbers = make([]int, 3, 5) |
cap位提供自动扩容的机制,用于追加元素
1 | numbers = append(numbers, 1) |
默认情况下,不单独设置cap位,就是cap=length
1 | var numbers = make([]int, 3) |
6.5 切片截取
与python很像,通过下标截取
1 | s := []int{1,2,3} |
7. map
7.1 声明
7.1.1 声明map类型
声明map的key是string,value是string
1 | var myMap1 map[string]string |
7.1.1 声明map类型并提供空间(常用)
提供一个默认的空间大小
1 | myMap1 := make(map[string]string) |
7.2 使用
7.2.1 遍历
1 | for key, value := range cityMap{ |
7.2.2 删除
1 | delete(cityMap,"China") |
7.2.3 修改
1 | cityMap['USA'] = "aaa" |
7.2.4 新增
1 | cityMap['China'] = 'ggg' |
8. struct
8.1 结构体定义
1 | type Book struct{ |
8.2 类
1 | type Student struct{ |
8.3 继承
1 | // 父类 |
8.4 接口
1 | type AnimalIF interface{ |
8.5 万能数据类型/断言
1 | func myFunc(arg interface{}){ |
9.反射
9.1 pair
pair是用于确定这个对象的实例是什么,在心中可以确认运行顺序
1 | // b: pair<type:Book, value:book{}地址> |
9.2 反射demo
1 | func reflectNum(arg interface{}){ |
9.3 获取复杂类型属性和方法
1 | type User struct{ |
9.4 反射解析结构体tag
1 | // 结构体tag是跟在属性后面的标签 |
10. JSON
1 | type Movie struct { |