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 使用
- 网络框架使用