结构体
-
struct 是值类型,所以当一个 struct 实例赋值给另外一个变量,这个变量不管如何改变都不会被修改
-
一般可以将 struct 指针传递给变量,例如
v : = &Persin{}
,这样的形式在 beego 框架的路由设置中就有出现 -
帮助文档:https://blog.csdn.net/qq_27682041/article/details/78789577
空接口
-
空接口可以接受任意数据类型,声明方式
var i interface{}
-
空接口类似于 C 语言中的万能指针,Go 中存储某个类型的值虽然可以推断,但是实际在内存中存储也是需要明确存储空间的,到底是给你分配几个单位字节
-
显然利用空接口存储值的内存地址更为方便,这样空接口只需要4个字节单位存储内存地址,调用的时候由内存地址去找实际存储空间,最后获取值
net/http
- 系统 http 包使用:https://www.cnblogs.com/mafeng/p/7068837.html
日志记录
- 系统 log 包的使用:https://studygolang.com/articles/9184
协程
-
协程创建简单
go fun()
,只需要关键字 gopackage main import ( "fmt" ) func main() { go func() { for i := 1; i < 100; i++ { fmt.Println(i) } }() go func() { for i := 100; i < 201; i++ { fmt.Println(i) } }() for { } }
-
协程的特点,我们可以与 java 中的线程来做个比较
-
go 项目中同时开两个协程,第一个协程打印1—100,第二个打印100——200,控制台输出 1——200,而在 java 环境下运行同样代码,会发现输出结果很凌乱
-
java 是线程,它为了能够运行本线程内的代码,就需要不断争取 cpu 资源,这样就会造成时间片多次跳转,这样的跳转是不划算的,每次跳转前必须记录当前执行环境(上下文)为了下次跳回来能接着执行,无形中增加了消耗,所以输出结果才会这么凌乱
-
go 是协程,任务执行主动权在协程自己手上, 在多并发的情况下,它的调度机制是在当前协程如果 io 没有阻塞,那么时间片不跳转,当前协程一直占用 cpu 资源,如果发生了 io 阻塞就立刻将时间片跳转到其他协程,本例几乎无阻塞,所以一直会按照顺序输出
-
当然也可以主动交出控制权,例如:
runtime.Gosched()
-