golang
jeffrey11223
这个作者很懒,什么都没留下…
展开
-
golang,使用类型断言的一个例子
type SpotPrice struct { ProductId string `db:"product_id"` //产品id High float64 `db:"high"` //最高价 Low float64 `db:"low"` //最低价 RenewDa原创 2017-10-25 20:28:14 · 1219 阅读 · 0 评论 -
golang 字符串编码转换 gbk转utf8
问题描述: 需要调取一个第三方的接口,接口返回的内容的编码格式是gbk的,但是golang内建只认utf8,所以需要将gbk的字符串转换为utf8,才能进行后续的数据处理。问题处理: 引入开源包 go get github.com/axgle/mahonia 此包的开源协议是BSD,所以可以放心的引用和使用mahonia源码解读:// ConvertString converts...原创 2018-02-08 11:21:03 · 17885 阅读 · 0 评论 -
用golang来面向对象编程
我们都知道,面向对象的三个要素:封装,继承,多态。而golang其实不能称之为严格意义上面向对象的语言,但我今天在网上翻阅到一篇用golang来写面向对象代码的文章,提供了一个思路,是英文的,这里我把它翻译了一下,供大家和自己参考。先送上传送门:http://yourbasic.org/golang/inheritance-object-oriented/翻译:传统的面向对象编程中提供...翻译 2018-03-07 20:26:14 · 1023 阅读 · 0 评论 -
使用Go1.9的sync.map
在Go1.9之前,go自带的map不是并发安全的,也就是说,我们需要自己再封装一层,给map加上把读写锁,比如像下面这样:type MapWithLock struct { sync.RWMutex M map[string]Kline}用MapWithLock的读写锁去控制map的并发安全。 但是到了Go1.9发布,它有了一个新的特性,那就是sync.map,它是...原创 2018-03-16 21:15:13 · 4545 阅读 · 0 评论 -
golang sync.once的应用
sync.once是被用于全局执行单次函数的场景,用法比较简单。 我们用到它主要是为了单元测试的执行,因为有些单元测试的函数需要和db交互,还有log的初始化,config配置文件的初始化,等等,这些其实都只需要执行一次就够了,对于单元测试来说,如何知道这些是否执行过呢,那就用sync.once,这样我就不需要关心这些是否重复执行,只要在每个用例的最前面执行sync.once的方法就行了。s...原创 2018-04-13 18:43:34 · 1580 阅读 · 0 评论 -
golang处理http response碰到的问题和需要注意的点
在处理http response的时候,偶然发现,body读取之后想再次读取的时候,发现读不到任何东西。见下方代码:原创 2018-05-25 20:50:22 · 18740 阅读 · 0 评论 -
grpc基于golang的客户端服务端整体预览
proto文件:/** @Title: 服务接口说明* @Description: 接口目录*/service SpotDataHandler { rpc GetProductInfo(GetProductInfoRequest) returns (GetProductInfoResponse) {}//获取所有商品信息}/*** @Title: 统一说明* @D...原创 2018-07-06 20:52:31 · 932 阅读 · 0 评论 -
golang httpServer对于keepAlive长连接的处理方式
当下http1.1对于长连接是默认开启的,golang的内置httpServer也很好的支持了这一点。今天查阅资料时,发现自己写了这么多的接口,但是对于httpServer是如何实现长连接的,却一时说不上来。于是就去go的src源码里面翻了翻。本文只讨论server端是如何确保长连接的,client端如何确保呢,这里先简要说一下,当调用client.Do()函数后,通过transport去获取...原创 2018-07-26 16:35:19 · 10364 阅读 · 0 评论 -
用go实现的kafka客户端,基于sarama和sarama-cluster
工作中需要将原先的消息队列替换成kafka,于是接触了基于go实现的sarama,又因为sarama不支持consumer group,于是又使用了sarama cluster,同时因为需要尽量保证消费一次的语义,就自己造了个简单的轮子,把sarama和sarama cluster封装到一起,同时实现了保证消费一次的语义,我给它起名为kago。先附上kago的依赖,需要先进行安装:go...原创 2018-08-05 22:51:08 · 23746 阅读 · 1 评论 -
用Go来爬虫 goquery使用
应工作内容需求,要爬取两个网站的数据(至于是什么网站,这里就不透露了,哈哈,害怕被发现了封ip),这些数据是定期更新的。由于后端的所有服务都是用go写的,于是不打算用python,还是想用go来完成这个需求,github里搜了下,发现goquery这个爬虫包用的人还挺多的,5000多个star,而且是BSD开源协议,于是毫不犹豫的拿来用了。首先,go get https://github.co...原创 2018-02-12 21:06:09 · 13072 阅读 · 4 评论 -
golang中的三个点 '...' 的用法
‘…’ 其实是go的一种语法糖。 它的第一个用法主要是用于函数有多个不定参数的情况,可以接受多个不确定数量的参数。 第二个用法是slice可以被打散进行传递。下面直接上例子:func test1(args ...string) { //可以接受任意个string参数 for _, v:= range args{ fmt.Println(v) }}原创 2018-01-25 21:10:22 · 66939 阅读 · 15 评论 -
golang读写锁使用
今天调试程序发现一个报错:fatal error: concurrent map writes 是因为多个goroutine对同一个map产出了竞争,解决这个问题的方法有两个,一个是用sync.Map,另一个是加锁。sync.map是go1.9新加的特性,这里暂且先不讨论。而且当前业务场景用读写锁完全可以解决,所以决定使用读写锁。先温习一遍概念:1、互斥锁 其中原创 2018-02-02 20:55:53 · 8495 阅读 · 0 评论 -
写golang restful接口时遇到的一个坑
话不多说,先上代码type detail struct { High float64 `json:"high"` Low float64 `json:"low"` Average float64 `json:"average"`}type Spot struct { UpdateDate string `json:"update_date"` Detai原创 2017-11-12 17:05:19 · 910 阅读 · 0 评论 -
闭包,使用不当,会出问题
同事在初始化redis配置的时候,给Dial函数赋值时用了闭包,导致程序上线后,数据怎么都加载不到redis中去,排查了半个多小时,总算找到了罪魁祸首。虽然自己之前对闭包也算了解,但是看到他的那段代码的时候,乍一看竟也没发现出问题来,所以决定写篇文章加深印象,避免自己以后也犯类似的问题。 先上代码:func InitRedis() error { GRedis = make原创 2017-11-18 22:16:13 · 494 阅读 · 0 评论 -
golang中map和slice的查询速度比较,结果意想不到
看到标题,第一反应,map肯定秒杀slice啊,我当时也是这么想的,毕竟前者的查询复杂度是O(1),后者是O(n)。 但是,事事难预料哦,用代码来说明问题:先写两个测试函数var testTimeSlice=[]string{"aa","bb","cc","dd","ee","aa","zz"}var testTimeMap = map[string]bool{"aa": true, "bb":原创 2017-11-05 18:09:25 · 14136 阅读 · 4 评论 -
解读Golang的web利器-----Gin
由于工作变动,开始接触golang服务器端的开发,目前的公司的后端用的全部是go,之前c++用得比较多,现在将自己的技术栈全部切换为golang那一套东西。go有一个好爹,生态也逐渐起来了,尤其在国内,社区和开源项目都很活跃,框架一个又一个。相比c++,它的开发效率更高,以及对并发的原生支持,使得go更能胜任后端服务的实现,包括restful的接口、并发模型等等。之前花了一个礼拜学习了go的语法,看翻译 2017-10-22 22:28:33 · 6229 阅读 · 0 评论 -
分析golang的slice排序
今天写代码,牵扯到给一个slice排序的问题,发现go的sort包里支持自定义排序,果断拿来用了。sort.Slice(priceList, func(i, j int) bool { return priceList[i].RenewDate > priceList[j].RenewDate })上面这个是使用sort.Slice()的例子。在此之前,先讲讲基础的Sort方原创 2017-10-30 21:06:55 · 3081 阅读 · 0 评论 -
redis性能调优一则
redis作为提升web服务端数据交互能力的重要利器,其本身也有开销,为了让redis变得更快,有必要对和redis交互的地方进行性能优化。 今天说一下golang中比较著名的一个redis库—-redigo。它的conn.Do()、Send()、Flush()、Receive()的合理使用是很有必要的。 先上一个我本地测试的例子:func main(){ _=InitRedis(10,"原创 2017-11-26 01:18:16 · 1004 阅读 · 0 评论 -
golang程序的监控神器----expvar
大家都知道,go自带的runtime包拥有各种功能,包括goroutine数量,设置逻辑线程数量,当前go版本,当前系统类型等等。前两天发现了go标准库还有一个更好用的可以监控服务运行各项指标和状态的包—-expvar。 expvar包为监控变量提供了一个标准化的接口,它以 JSON 格式通过 /debug/vars 接口以 HTTP 的方式公开这些监控变量以及我自定义的变量。通过它,再加上met原创 2017-12-24 20:11:47 · 16000 阅读 · 8 评论 -
用golang实现一个熔断器
首先贴出仓库地址:https://github.com/JeffreyDing11223/goBreaker这个熔断器实现简单,使用方便,同时大家也可以fork后进行自己需要的改造,当然,也欢迎大家提pr,一起优化goBreaker下面介绍下goBreaker:goBreaker状态机状态转换逻辑初始为closed状态,一旦遇到请求失败时,会触发熔断检测(见下方的 ShouldTri...原创 2019-01-01 15:38:14 · 2664 阅读 · 0 评论