环境搭建
go语言优势
不依赖其他库:将依赖项直接编译到了可执行文件中
不需要像其他语言去绑定cpu分配时间片,这些go底层都实现封装好了
全局变量
:=方式不可作为全局变量声明方式
iota关键字 -只能与const关键字配合使用
默认为0,后续常量自动累加1
Import导包
指针概念:至少要知道一下三个概念
var p *int
p —— 指向变量的地址
&p —— 指针本身的地址
*P ——指向变量的值
那么 var pp **int
pp = &p
pp &pp *pp分别代表什么意思?
slice切片
cap是len的两倍左右!
每次扩容都是按2倍的cap扩容
go的继承封装多态
go反射机制
go的变量反射结构为下图:所以拿到变量就可以知道他的类型和数值
结构体标签
goroutine
使用:
channel:goroutine无法获得函数的具体执行情况,可以通过channel获得,也可以通过channel进行协程间通信
默认channel变量是加锁的
上述例子c<-666后会卡住,只有num:=<-c将c的数据取出后才会继续执行,也就说defer必然在num:=<-c语句执行后执行!
这就是无缓存channel
无缓冲channel原理如下图
有缓冲channel原理如下图:
有缓冲代码如下,但是如果c 复制了4次,那么就会卡住!
关闭channel
gomodule
项目案例
go的生态发展
1、匿名函数:函数定义的同时可以进行调用
匿名函数:
1.为了防止命名冲突
2.内存可以即用即释放
3.可以有效形成闭包
2.闭包:匿名函数+以外的变量,以下为闭包的使用样例
闭包可以有效的简化代码
从上图可以看出匿名函数以外的变量 是一直存在内存中的,数值不重置。所以闭包内存不可乱用。
3.defer关键字
在Golang中,程序遇到defer关键字,不会立即执行defer后的语句,二是将defer后的语句压入一个栈中(拷贝当前变量值,不会随着后面变量值变化而变化),然后继续执行后面的语句
栈有先进后出的特点
使用场景:如果你想关闭摸个使用的资源,可以在创建该资源时随手写上defer关闭该资源,因为defer有延迟执行机制(函数执行完毕再执行defer压入栈的语句)。
4.GOPATH
当前开发人员工作路径,import 包名,寻找的路径是从GOPATH/src后路径开始的
5.指针理解 值得思考
6.defer + recover 错误处理机制(异常处理)
7.数组首地址+1
var arr1[3] int16 arr1首地址为0xc0000100b0 arr1+1地址为 0xc0000100b2
var arr2[3] char arr2首地址为0xc0000100b0 arr1+1地址为 0xc0000100b1
所以数组的每个元素地址间隔是取决于数组类型的!
8.切片slice
切片是对数组连续片段的引用,切片切得是数组的片段!
切片有3个字段的数据结构:一个是指向底层数组的指针,一个是切片的长度,一个是切片的容量
终止项不包含在切片内:即arr[1:3] 表示:索引从1开始到3结束(但不包含3)
切片容量是长度的两倍左右
索引len(arr) 为2 cap(arr)可能为5
切片定义好后,不可以直接使用,需要让其引用到一个数组或make一个空间供切片来使用
切片可追加元素:append,原理是创建新数组、复制老数组元素、然后删除老数组元素。类似C++的vector
9.面向对象
入门资料:
笔记:
切片和数组:切片是数组的引用,多个切片之前同一个数组,是共享存储的。所以使用起来效率更高。
切片定义不需要指定大小,大小是动态可变的。数组声明是就需要固定大小。
2021.9.17:
GO 高级编程:
1.rpc:
网关:接受所有的请求,然后往下分发
api网关: