proto
ProtobufProtoBuf是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。是谷歌的亲儿子
自定义数据结构:1234567891011121314// 定义版本syntax="proto3";package Main;// 这个不加在命令行编译会报错,提示你必须指明packageoption go_package = "./";// 定义结构体message Student{ string name = 1; required bool male = 2; repeated int32 scores = 3; //这里相当于定义了一个int类型的数组 optional hobby = 4; reserved 2, 15, 9 to 11; // 保留2,15,9到11这些标识号给下次用,如果 ...
go_elastic
Golang ElasticSearch库使用Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎。所以可以通过它部署自己的搜索服务,数据分析的话暂时好像还用不到。
下载官方的库
1go get -u github.com/olivere/elastic
定义自己的索引
文档类型:
keyword: 表示精确值不会参与分词
text: 会通过分词插件或分词模式对字段进行分词,对中文来说,比较常用的是ik分词器,看了下效果,确实不错。
123456789101112131415161718192021222324252627282930// 索引mapping定义,这里仿微博消息结构定义const mapping = `{ "mappings": { "properties": { "user": { "type": "keyword& ...
再探 GIN
GIN 中间件1. 日志打印需要的引入的包:
将日志按天分隔
github.com/lestrrat-go/file-rotatelogs”
github.com/rifflock/lfshook
go里面一个用的比较多的日志框架
github.com/sirupsen/logrus
整个代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677func Logger() gin.HandlerFunc { filePath := "PsBlog/log/log" src , err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0755) if err!=nil{ fmt.Println(" ...
同源 & 跨域
同源
协议相同
域名相同
端口相同
AJAX 不能跨域,只能同源
WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀, 不实行同源策略,在请求头中有一个 origin 字段, 即请求源(请求来自哪个),服务器根据这个字段可以判断是否许可,如该域名在白名单或黑名单中等。
Cors: 跨源资源分享(Cross-Origin Resource Sharing),不同于JSONP只能发送GET请求,它可以发送各种类型的请求。
go的包:
github.com/gin-contrib/cors
Cors:简单请求: HEAD / GET / POST 以及HTTP的header信息有限制包括。
而浏览器对于简单请求,直接发送Cors请求,即在头信息中添加了 origin 字段。如果服务器允许这次请求,则在响应报文中会添加以下字段:
1234Access-Control-Allow-Origin: http://api.bob.comAccess-Control-Allow-Credentials: trueAccess-Cont ...
RPC学习
RPC基础用法首先copy下RPC的基本定义:
远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。
golang官方库为net/rpc,提供encoding/gob方法实现编解码
RPC相关内容:
数据传输:JSON Protobuf thrift
负载:随机算法 轮询 一致性hash 加权
异常容错:健康检测 熔断 限流
golang编写rpc程序必须满足以下条件:
结构体首字母得大写
必须是公有的方法,即方法首字母大写
只有两个参数,第一个为接收参数,第二个为返回给客户端的指针类型的参数,所以通信时需要将信息封装好才能满足要求
一个返回值:error
大致框架流程:
服务端:
1234567891011121314151617181920212223242526272829303132333435import "net/rpc"// 服务端注册的结构体type ServiceName ...
go-redis基本类型及操作
Go-redisgo get -u github.com/go-redis/redis
一般的init操作:
123456789101112131415// 根据redis配置初始化一个客户端func initClient() (err error) { redisDb = redis.NewClient(&redis.Options{ Addr: "localhost:6379", // redis地址 Password: "", // redis密码,没有则留空 DB: 0, // 默认数据库,默认是0 }) //通过 *redis.Client.Ping() 来检查是否成功连接到了redis服务器 _, err = redisDb.Ping().Result() if err != nil & ...
《图解HTTP》学习(一)
HTTP 状态码
2XX: 成功状态码,请求正常处理完成
3XX: redirect, 需要进行附加条件以完成请求
4XX: 客户端错误,服务器无法处理请求
5XX: 服务器错误,处理请求过程出错
200: OK4XX 客户端错误:
400 : 请求报文中存在语法错误
401 :客户端第一次发送请求时,服务端返回401并弹出认证窗口,若客户端认证失败,则继续返回401
403 : Forbidden 没有权限,拒绝客户端访问
404 : 最常见的,即请求的资源不存在
5XX 服务器错误:
500 : Internal Server Error, 执行请求时出错,可能是web应用中存在bug
503 : Service Unavailable,服务器超负载或者在停机维护
Go语法糖和陷阱
:=1. 多变量赋值可能会重新声明
左侧存在新变量,则旧变量会被重新声明
左侧无新变量,则会报错 no new variable on left side of :=
所以我们看下面的例子:
12i, j := 0, 1k, j := 5, 4 //这里的j其实是被重新声明的了,值为4
2. 不能用于函数外部可以将:=分解为声明和赋值,而赋值不能出现在函数外部会报错syntax error: non-declaration statement outside function body
还要充分注意作用域的为题
可变参数 ...如最常用的fmt.Println(arg ...interface{})attention:
可变参数及 …必须写在参数列表最右边
内部当作 slice 解析,可以用range 遍历
按上面所说可以当作slice解析,所以可变参数能直接传slice类型,但注意要以 name… 的格式。
eg:12345678910111213141516func Greeting(greets string, ...
Go反射初步
interface特殊的类型,代表方法的结合,所有的类型都实现了interface{} 的接口,interface其中包含了 (value, type)来存储类型和值。
反射包里有两个接口:
reflect.Type
reflect.Value
反射三定律:
将任意类型可转化成反射对象
123456789func main(){ var x float64 = 3.4 // 注意是通过x的类型(type(x))将t转化为reflect.Type类型 t := reflect.TypeOf(x) fmt.Println("type: ", t) // 同样 v := reflect.ValueOf(x) //reflect.Value类型 fmt.Println("value: ", v)}
将反射对象还原成interface对象接着上面的代码
1var y float ...
GO内存管理与垃圾回收
内存分配
堆区: arena 512G,方便管理将其划分成了一个个page,大小为8kb一个页。
spans: 存放span指针,每一个span中包含1个或多个连续页(后者是因为大对象)
bitmap: 和spans都是为了管理堆区
根据对象大小,golang会分了一系列的class/object
span的结构定义:
1234567891011121314type mspan struct{ next *mspan prev *mspan //链表指针,将span串接起来 startArr uintptr //管理的页的起始地址 npages uintptr nelems uintptr //块即对象个数 allocBits //分配位图,显示哪些位是否分配,每一位代表一个对象 allocCount uint16 //已分配块的个数 spanclass spanclass //classid ...