golang基础学习

1. Public & private
golang中方法和属性名(包含结构体中的属性)区分是私有属性||方法的办法是看首字母是否大小写,大写相当于public(可跨包使用) 小写相当于private(只在本包内可用)
2. const
Const 常量(常用于枚举…)是只读属性 ,const中添加关键字iota,每行iota都会累计加1,第一行iota的默认值是0 ;【注:iota 只能出现在 const() 中,只能在 const() 中进行累加】


3. go中函数的多返回值的三种写法


4. Import包 & init 函数(被优先调用)



上面结果可以看出import包 的 init 函数会被优先调用


5. Slice 切片
![[图片]](https://www.kandaoni.com/uploads/202212/22/3501929b106bdf38.webp)
6. Map
![[图片]](https://www.kandaoni.com/uploads/202212/22/04661bdf7ea8ac01.webp)
7. Struct 基本定义与使用
(简单理解:将多种基本数据类型组合在一起构造一个复杂的新的数据类型来用)
![[图片]](https://www.kandaoni.com/uploads/202212/22/c1a8cede53c67526.webp)
8. 基于struct,面向对象基础


改进:

此时就可以调用set成功~
9. go中面向对象的继承



10. 面向对象 多态 的简单实现
struct对象继承一个接口的话,需要实现接口中的全部方法




11. 空接口 万能类型,与类型断言机制

12. 反射 (pair 对)




13. 反射(reflect包方法)





14. 反射 解析结构体的tag

15. 结构体标签在json中的应用
结构体–》json marshal()
![[图片]](https://www.kandaoni.com/uploads/202212/22/dfdf84f82de5e687.webp)
Json --》 结构体 unmarshal()


16. Goroutine 原理













复用线程:

G1若还要继续执行重新加入队列,不执行就干掉了
利用并行 机制:

抢占:

全局队列:
见上面 stealing 和 hand off 两个展示图
17. Goroutine 创建


匿名函数来实现:

在go 子协程中退出协程:
1、只退出里面的那个函数:
![[图片]](https://www.kandaoni.com/uploads/202212/22/a3dc15886d4e4891.webp)
两个函数都退出协程:

调用有形参的协程:

18. Channel 保证go 协程之间的通信
不能获取到go 协程的返回值,因此不能用返回值的方式来进行main 协程与go 协程之间的通信

channel:


从结果看,main 协程总在匿名go协程后结束,因为channel有一定的协程 间 协调能力(互相阻塞唤醒)

19. channel有缓冲与无缓冲同步问题




若发送到channel buffer中的个数大于 capital 则会发生阻塞 过会儿go 子协程exit,如下,

同理:

20. 关闭channel & range


总结:

利用 range:

21. channel与select


Select 具备多路channel的监控状态功能
22. defer()学习

结果: 30 、 20 、10 、30
23. Go modules
若更改go path MAC需要在./~bashrc 中export
go env 查看go的所有环境变量

-u 可以查看下载状态






- Go modules 创建个简单项目


真正用的子模块~
go sum保证当前用的库是一个完整的库,每个库的连接后面有各自的对所有文件做的hash校验码,
而go.sum中go.mod只是对这个文件做了一个hash校验码。

改变模块的依赖关系

