golang
weixin_41571449
这个作者很懒,什么都没留下…
展开
-
go map并发panic问题
最近工程上有段代码panic了,发现又是犯了map并发写的问题。自己来回顾一下这个问题,避免自己也犯错go map写入的源码在这里其中有一段throw exception和写入标志位的逻辑 if h.flags&hashWriting != 0 { throw("concurrent map writes") } hash := t.hasher(key, uintptr(h.hash0)) // Set hashWriting after calling t.hasher, sin原创 2020-08-29 21:16:22 · 2184 阅读 · 1 评论 -
go mod在工程中的使用原则
gomod是go的包管理工具,可以方便地管理依赖。减少git目录本身的容量,是一个很好的工具,但是在工程事件中出现一些疑惑,gomod到底该不该出现在通用包中呢。下面是几点思考支持通用包需要依赖的通用包是对外提供能力的,因此需要确保逻辑本身是可用的。在通用包中定义的方法在特定的依赖版本上是经过测试可以正确正常执行的例如:假设通用包是B,依赖通用包的是应用包C。B和C依赖了不同版本的A包B依赖了1.0的A包方法a,C依赖了2.0的A包中的方法b。b是新方法,必须使用2.0的A包,但是2.0的A包更新原创 2020-08-05 02:11:30 · 165 阅读 · 0 评论 -
golang操作redis
golang操作redis主要有两个库, github地址 redigo redis区别是redigo类似于一个redis_cli的client,执行各项命令都用Do函数去做. redis则将各种操作封装成函数了 个人倾向于redis,redigo执行命令过于繁琐了,初接触用Do方法执行命令容易出错,比如range里面的返回的整型数都要用string类型的,让我觉得有些困扰起cli...原创 2018-03-03 17:05:12 · 2892 阅读 · 0 评论 -
gorm的一些使用技巧和遇到的一个坑
gorm是国内开发者所做的开源golang orm框架,做的比较成熟。 获取方式: go get -u github.com/jinzhu/gorm使用方法查看文档即可,还是比较符合sql语句的写法和设计方式的,当然也支持Raw语句,自己拼出语句去执行。一个小技巧: 查看执行的sql语句,拼了大段的where,find以后想看事实执行的sql是什么,毕竟是开源框架,打出来看看避免自己...原创 2018-03-17 11:42:01 · 23858 阅读 · 0 评论 -
golang strings包整理
所有语言都有字符串处理的包,今天整理下golang的strings包 完整的介绍doc上有golang strings docContains, ContainsAny, ContainsRune ContainsRune(s,p)用于查找unicode编码为p的unicode是否在s里面 ContainsAny(s,p)只要满足p中的1个unicode字符在s中即可,Contains需...原创 2018-03-17 18:26:55 · 1435 阅读 · 0 评论 -
golang time包做时间转换
Time类型 Now方法表示现在时间。 func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time 返回现在的时间,func (t Time) Unix() int64将时间转换为unix时间戳,因为duration的限制,所以应该只能计算从1970年开始的250年左右 func...原创 2018-03-26 00:05:14 · 8494 阅读 · 0 评论 -
msgp的用法和一些局限性
msgp是golang用来做序列化的一个工具获取方式: go get github.com/tinylib/msgp以官网例子来看wujingcideMacBook-Pro:msgp wujingci$ cat my_types.gopackage maintype Person struct { Name string `msg:"name"` ...原创 2018-04-15 20:46:13 · 2221 阅读 · 1 评论 -
golang sort包
golang sort包可以对所有实现了sort.interface的接口对象slice排序,排序时候使用的是插入排序,快速排序还是桶排序是包自身选择的,当你做的排序并没有极高的性能要求时,可以直接使用sort包里的方法。 这是官网定义的例子type Person struct { Name string Age int}type ByAge []Personfun...原创 2018-06-18 16:20:36 · 708 阅读 · 0 评论 -
用go-wrk,go-torch做服务器压测和性能分析
常常会有这样的场景,写了一个接口,上线发现性能不大好,费资源处理慢,可能是某个rpc耗时长,可能是可以并发的地方没有做并发,但发现问题比较麻烦,最好能有一些可视化的工具。当然我们能这么做,是因为go语言集成了profile采样工具,并且允许我们在程序的运行时使用。准备工作写个最简单的web server,一个helloworldpackage mainimport ( ...原创 2018-09-09 21:37:40 · 2811 阅读 · 1 评论 -
golang中的json decode丢失精度的问题
最近发现的一个坑当用enconding/json包的时候,数字默认是处理为float64类型的,这就导致了int64可能会丢失精度,这时候要用dec.UseNumber将处理的数字转换成json.Number的形式,再自己去做type assertion代码package mainimport ( "fmt" "encoding/json" "strings")func Cr...原创 2019-02-04 17:34:44 · 2885 阅读 · 0 评论 -
业务实现中的本地缓存(GO)
实际业务实现中常常会使用到本地缓存,用以减少对实际存储的访问,我们会针对不同的使用场景设计不同的缓存模式,但是基本的实现方式都是一个巨大的Map/Table(不同语言)。下面用go来说,总体的实现都是通过一个,根据不同的需求,LFU,LRU再设计map里面具体的entry的struct,保存需要的计数用来做淘汰,下面从不同使用角度来说明一下普通的保存配置项的本地缓存实际使用中,某些中台服务/服...原创 2019-09-01 17:29:34 · 2876 阅读 · 1 评论 -
常见qps限制方式
生产环境经常会跑一些离线任务,或者有一些异步任务在问题恢复后积压需要放水,此时我们需要控制对下游的访问qps,避免打挂下游,有多种方式去实现。当你是一个单进程/单携程通常是一些小的回扫任务,多用于处理临时任务。因为是单个进程/携程,简单的话可以首先time.Sleep()较长一段时间,同时打一下执行时间的大概日志,然后根据实际调用下游的时间,估出一个值调整下游的qps。如果下游超时不稳定有尾...原创 2019-09-07 21:21:57 · 10181 阅读 · 0 评论 -
Go依赖管理工具(四) glide
上一篇 Go依赖管理工具(三)govender 首先澄清一点,这个项目不是android里面的glide,用于图片加载和缓存的那个glide。而是做go package管理的glide 安装方法 go get github.com/Masterminds/glide 使用 glide init/create去创建glide.yaml glide会扫描项目的depende...原创 2018-03-10 18:26:17 · 3741 阅读 · 0 评论 -
Go依赖管理工具(一)godep
git地址 https://github.com/tools/godep 安装方法 go get github.com/tools/godep 关于GOPATH设置可以参考另一篇文章 GOPATH设置和go get替换HTTPS的技巧 用法 安装好后godep -h查看所有功能 主要讲讲godep save 和 godep restore这两个 godep save...原创 2018-03-10 18:20:44 · 3759 阅读 · 1 评论 -
golang http框架gin (三 )
上一篇 golang http框架gin (二 上传文件,这个例子是git上找的router.POST("/upload", func(c *gin.Context) { file, header , err := c.Request.FormFile("upload") filename := header.Filename fmt.Println(header原创 2018-01-11 00:23:06 · 1192 阅读 · 0 评论 -
golang http框架gin (二)
上一篇 golang http框架gin (一 上节讲到简单例子,其实gin.default() 生成的是一个HttpHandler,他本身可以作为httpServer的handler来工作,而我们可以修改handler的参数,例如:r := gin.Default() r.GET("/ping", func(c *gin.Context) { c原创 2018-01-10 01:57:17 · 3741 阅读 · 0 评论 -
goland集成go fmt/go gometalinter/goimports
先简单介绍一下这三个工具 go fmt是用来规范格式的,简单用法go fmt xxx.go(当然也支持很多复杂功能) go gometalinter用来做静态分析 goimports用来自动导入dependencygoland导入这些方便的工具Preference->tools->File Watchers 点+号,如果没有特别复杂要求就用默认配置就好了,这样主动存文件时候就会做如原创 2018-01-13 20:44:05 · 5852 阅读 · 0 评论 -
Go依赖管理工具(二)dep
Go依赖管理工具(一)Godep git地址 https://github.com/golang/depdep是golang官方给出的包管理工具安装方法 go get -u github.com/golang/dep/cmd/dep用法 查看dep -h获取所有方法还是着重讲dep init和dep ensure两项dep init扫描目录获取dependenc原创 2018-01-04 23:24:00 · 1624 阅读 · 0 评论 -
golang http框架gin (一)
简介gin这个词很迷,看柯南的同学应该知道这是杜松子酒。 这里介绍的gin是一种golang的web框架,乍看之下用法和python的flask很像。这是一种对golang官方提供的httprouter的改进,测试下来比httprouter快40倍安装go get github.com/gin-gonic/gin使用本节会解释官网的快速入门例子,剩余部分会在后续章节中罗列原创 2018-01-07 09:06:35 · 7236 阅读 · 2 评论 -
protobuf解析(二)
接上节 protobuf到底有多节省字段,我们来比较下 对于message helloworld { int32 id = 1; string name = 2;}protobuf表示 id = 101, name = hello只需要这么多字段 08 65 12 06 68 65 6C 6C 6F 77 65即101, [68 65 6C 6C 6F]表示h原创 2018-01-18 01:14:38 · 581 阅读 · 0 评论 -
Protobuf解析(三)
接上节说的grpc 关于protobuf需要安装protoc并get几个go包go get -u github.com/golang/protobuf/protogo get -u github.com/golang/protobuf/protoc-gen-gogo get google.golang.org/grpc我们用grpc-go的例子来跑一跑 proto文件:sy原创 2018-01-18 13:37:08 · 915 阅读 · 0 评论 -
Go 堆排序
为了试验python高性能上的分析python 函数和整体执行时间的各种工具,写了个堆排序。发现自己好久没写GO了。。于是用Go写了一遍练练手package mainimport "fmt"func Heapify(A []int, i int, heap_size int) { l := i*2 + 1 r := i*2 + 2 var largest int原创 2018-01-27 18:46:09 · 272 阅读 · 0 评论 -
GOPATH设置和go get替换HTTPS的技巧
Go Env用go env可以查看自己的GOROOT和GOPATH 针对go1.9以前的版本可以将GOROOT和GOPATH写到配置文件里,以mac为例子 wujingcideMacBook-Pro:~ wujingci$ cat ~/.bash_profile export GOPATH=$HOME/go export GOROOT=/usr/local/go PATH=$GOR...原创 2018-01-04 00:42:02 · 8757 阅读 · 0 评论 -
Go依赖管理工具(三)govendor
上一篇 Go依赖管理工具(二)dep 安装方法 go get -u github.com/kardianos/govendor用法govendor init初始化 vendor 目录,生成一个初始化的vendor.jsongovendor add +local加本项目中用到的dependency加到vendor.json里面govendor add +exte原创 2018-01-05 22:54:29 · 1686 阅读 · 0 评论