goframe、beego、iris、gin
突出优点
goframe主要以工程化和企业级方向为主,特别是模块化设计和工程化设计思想非常棒。
针对业务项目而言,提供了开发规范、项目规范、命名规范、设计模式、开发工具链、丰富的模块、高质量代码和文档,社区活跃
。作者也是资深的PHP开发者,PHP转Go的小伙伴会倍感亲切。
beego开源的比较早,最早的一款功能比较全面的Golang开发框架,一直在Golang领域有着比较大的影响力,作者谢大多年组织着国内影响力比较大GopherCN活动。
beego有着比较丰富的开发模块、开箱即用,提供了基于MVC设计模式的项目结构、开发工具链,主要定位为W
Do not communicate by sharing memory; instead, share memory by communicating.
不要通过共享内存来通信,而要通过通信来实现内存共享。
CSP(Communicating Sequential Processes)模型
数据结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type hchan struct {
qcount uint // chan 里元素数量
dataqsiz uint //
Go语言与鸭子类型的关系
鸭子类型 Duck Typing
If it looks like a duck,swims like a duck ,and quacks like a duck ,then it probable is a duck
Duck Typing,鸭子类型,是动态编程语言的一种对象推断策略,它更关注对象能如何被使用,而不是对象的类型本身。Go 语言作为一门静态语言,它通过通过接口的方式完美支持鸭子类型。
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
typ
基于失效的缓存一致性协议 (invalid-based)
状态
MESI对应4种状态
* 已修改Modified(M)
缓存行是脏的 ,与主存值不同。如果别的CPU内核要读主存这块数据,该缓存行必须回写到主存,状态变为共享(S)
* 独占Exclusive(E)
缓存行只在当前缓存中,但是干净的(clean),与主存中数据一致。当别的缓存读取它时,状态变为共享;当前写数据时,变为已修改状态。
* 共享Shared(S)
缓存行也存在于其它缓存中且是干净的。缓存行可以在任意时刻抛弃。
* 无效I
引入
defer是Go语言中的一个关键字(延迟调用),一般用于释放资源和连接、关闭文件、释放锁等。和defer类似的有java的finally和C++的析构函数,这些语句一般是一定会执行的(某些特殊情况后文会提到),不过析构函数析构的是对象,而defer后面一般跟函数或方法。
1、 多个defer语句,按先进后出的方式执行
1
2
3
4
5
6
7
8
9
10
package main
import "fmt"
func main() {
var whatever [5]struct{}
for i := range whatever {
defe
map实现原理
Go语言采用哈希查找表,并且使用链表解决哈希冲突
内存模型:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type hmap struct{
count int //K,V数目. 调用len()返回此值
flags uint8 //标志位,是否已有其他协程在执行写操作
B unit8 //桶的数量的对数 2^B
noverflow uint16 //使用的溢出桶近似数
hash0 uint32
异同
slice 的底层数据是数组,slice 是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。
组是定长的,长度定义好之后,不能再更改
而切片则非常灵活,它可以动态地扩容。切片的类型和长度无关
数组就是一片连续的内存, slice 实际上是一个结构体,包含三个字段:长度、容量、底层数组。
1
2
3
4
5
type slice struct{
array unsafe.Pointer //元素指针
len int //长度
cap int //容量
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
正向代理:客户端 <一> 代理 一>服务端
客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
反向代理:客户端 一>代理 <一> 服务端
客户端向反向代理命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
原厂 VS 改装
用了好久19寸黑色轮毂,换回18寸