GO 笔记
基本库和概念
1  | //*T 可以传给值接收,也可以传给指针接收,所以传入尽量*T,接收也尽量用*T呗  | 
模块 类概念
go 的包和文件夹名是一样的(跟文件名关系不大)
java:com.alibaba.dubbo.xxx
c++:namespace std
go: package 包
类
继承、封装、多态
1  | type Person struct{  | 
嵌入类型
包含嵌入类型所有的财产(你是我的,你所有东西都是我的)
1  | 类型  | 
1  | func main() {  | 
可变参数
…interface{},传入的当做[]interface{}切片
1  | func Println(vals ...interface{}){  | 
http.Request 请求
服务端需要 Request,和 Response 往里面写数据
包括:
1.第一行
2.请求头
3.请求体(一般 post 才有)
1  | resp:=DefaultTransport.send(req)//创建一个连接,然后通过这条连接发送req数据,服务端通过这条连接读取req然后构建resp,(也通过resp可以拿到连接的标识,去某个地方获取到这条连接),然后通过连接把resp发送回去  | 
http.Response 响应
客户端需要 Response 从里面读数据,读完了就关闭
包括:
1.第一行数据
2.返回头
3.返回 body
4.请求实例 http.Request
可拿到底层连接 net.Conn(可读可写)
读写锁
1  | func (rw *RWMutex) Lock() 写锁,如果在添加写锁之前已经有其他的读锁和写锁,则lock就会阻塞直到该锁可用,为确保该锁最终可用,已阻塞的 Lock 调用会从获得的锁中排除新的读取器,即写锁权限高于读锁,有写锁时优先进行写锁定  | 
context
三种 ctx
1  | timerCtx:超时的ctx,超过某个时间就close(chan)  | 
并发、channel、select、sync
超时控制
1  | taskdone:=make(chan struct{},1)  | 
scanf 扫描
一行一行读取数据嘛,或者一个个字符的读取
读完之后就丢弃掉数据
1  | buf:=bytes.NewBuffer(sli)//buffer读完之后就丢弃掉数据  | 
go time
1  | 转为ts:t.unix()  | 
json,xml,gob
1  | var network bytes.Buffer  | 
字符串拼接
1  | a+="hello"  | 
指针
永远不要使用一个指针指向一个接口类型,因为它已经是一个指针。
1  | write(w io.Writer)//没有w *io.Writer这种  | 
包管理
1  | 自己clone  | 
1  | golang.org/x/net ,其实镜像托管在在 github.com/golang/net  | 
1  | mkdir -p $GOPATH/src/golang.org/x/  | 
http 参数解析
1  | r.ParseForm()  | 
error 错误处理
1  | //1.最普通  | 
默认值和 nil
1  | bool -> false  | 
TCP 和 UDP
1  | //tcp  | 
1  | func main() {  | 
1  | /**  | 
细节点
1  | select{}//阻塞  | 
1  | SERVE_HTTP=":3030" go run 43.go  | 
默认类型
1  | nil 是 interface、function、pointer、map、slice 和 channel 类型变量的默认初始值  | 
go 修改值全部用指针
切片,map 先 make,再取地址比较好
问题代码
1  | //下面是一个坑  | 
1  | func fillUserInfo(queryUids *[]int64, userInfoTempMap map[int64]*model.RUserInfo, selfU int64) {  | 
需要掌握的点
- http 请求
 - http 服务
 - json 解析
 - 日志
 - mysql 库
 - redis 库
 - list 和 map 使用
 - goroutine 使用
 - 网络框架使用