GOLANG
winlinvip
直播和WebRTC程序员,开源服务器SRS
展开
-
Go开发关键技术指南
Go开发关键技术指南原图链接地址:https://www.processon.com/view/link/5df22829e4b010171a411e7d#map感谢阿里巴巴云原生微信公众号转载了这篇文章,给了很重要的改进建议,从Markdown转微信公众号也做了大量工作,配图和排版让阅读变成一种享受。如果你更习惯微信阅读,可以读下面四章:Go 开发关键技术指南 | 为什么你要选择 G...原创 2020-01-10 19:33:48 · 5083 阅读 · 1 评论 -
GOLANG实现超时对象检测的最好理解的方式
原文:https://gocn.io/article/328依赖于心跳的系统,都需要超时检测。比如P2P系统中客户端每隔120秒向数据服务器发送一次数据汇总,服务器就需要维护一个超时时间。比如一个UDP服务器,在和客户端之间创建Session之后,如果没有数据包,一般会有Ping包,说明这个Session是存活的,服务器在发现Session超时后也需要清理。首先,服务器一般需要维护一个列表,以Pee原创 2017-05-16 17:40:57 · 2873 阅读 · 1 评论 -
GOLANG的context和并发模型
GOLANG1.7新增了context,最初这个package是在golang.org/x/net/context中的,后来证实对很多程序都是必须的,就纳入了标准库。对context的介绍是在context,读这个blog之前,要先读pipelines(pipelines提出了使用close(chan)的方式广播退出事件)。一般来说,context是用在request的处理,例如http请求的处理中原创 2017-05-03 19:27:13 · 4199 阅读 · 2 评论 -
GOLANG实现类似C++模板,返回符合类型的对象
原文参考:https://gocn.io/article/319在协议解析中,C++的模板有比较大的作用,有时候我们希望丢弃所有的包,只留下特定类型的包。参考SRS的代码SrsRtmpClient::connect_app2:类型系统的设计, SrsConnectAppResPacket继承自SrsPacket:class SrsPacket;class SrsConnectAppResPacke原创 2017-05-09 20:20:57 · 3012 阅读 · 0 评论 -
使用两个context实现CLOSE包的超时等待
原文:https://gocn.io/article/331在UDP中,一般发送者发送包后,如果一定的时间对方没有收到,就需要重传。例如UDP实现握手的过程,如果握手的包,比如RTMFP协议的IHELLO,发送给对方后,如果一定1秒没有收到,就应该重发一次,然后等3秒、6秒、9秒,如果最后没有收到就是超时了。最后一个Close包,发送者不能等待这么长的时间,所以需要设置一个较短的时间做超时退出。一般原创 2017-05-18 20:39:49 · 906 阅读 · 0 评论 -
GOLANG使用嵌入结构实现接口
原文:https://gocn.io/article/332考虑一个Packet接口,一般会返回一个Header,例如:type PacketHeader struct { ID uint32 Timestamp uint64}type Packet interface { encoding.BinaryMarshaler encoding.BinaryUnmars原创 2017-05-19 13:24:18 · 2738 阅读 · 0 评论 -
GOLANG使用Context管理关联goroutine
原文:https://gocn.io/article/333一般一个业务很少不用到goroutine的,因为很多方法是需要等待的,例如http.Server.ListenAndServe这个就是等待的,除非关闭了Server或Listener,否则是不会返回的。除非是一个API服务器,否则肯定需要另外起goroutine发起其他的服务,而且对于API服务器来说,在http.Handler的处理函数中原创 2017-05-19 15:09:06 · 2859 阅读 · 1 评论 -
GOLANG错误处理最佳方案
原文:https://gocn.io/article/348ERRORGOLANG的错误很简单的,用error接口,参考golang error handling:if f,err := os.Open("test.txt"); err != nil { return err}实际上如果习惯于C返回错误码,也是可以的,定义一个整形的error:type errorCode intfunc原创 2017-06-05 10:06:41 · 12078 阅读 · 0 评论 -
GOLANG空指针崩溃时堆栈消失和解决方案
原文:https://gocn.io/article/351在错误处理这个文章中,tkk提出了空指针时堆栈消失的问题,看下面的例子:package mainfunc main() { run() // line 4}func run() { causedPanic()}func causedPanic() { //defer func() {}() // line 1原创 2017-06-07 17:06:25 · 13238 阅读 · 0 评论 -
GOLANG使用Context实现传值、超时和取消
原文:https://gocn.io/article/373GO1.7之后,新增了context.Context这个package,实现goroutine的管理。Context基本的用法参考GOLANG使用Context管理关联goroutine。实际上,Context还有个非常重要的作用,就是设置超时。比如,如果我们有个API是这样设计的:type Packet interface { e原创 2017-06-28 16:25:22 · 14372 阅读 · 0 评论 -
GOLANG最容易做测试MOCK
原文:https://gocn.io/article/353测试时,一些底层的库非常难以MOCK,比如HASH摘要算法,怎么MOCK?假设有个函数,是用MD5做摘要:func digest(data []byte, h hash.Hash) ([]byte, error) { if _, err = h.Write(data); err != nil { return nil原创 2017-06-09 18:27:32 · 12635 阅读 · 0 评论 -
GOLANG测试必须用带堆栈的errors
原文:https://gocn.io/article/366GOLANG测试时,可以用匿名对象填充测试序列,但是如果没有带堆栈的errors,那么会造成出现错误时无法排查。先看测试序列的填充,参考tricks-2015这个文章,怕你翻不了墙,我把内容粘贴过来就是:Anonymous structs: test cases (1/2)These properties enable a nice way原创 2017-06-22 18:11:45 · 2479 阅读 · 0 评论 -
GOLANG宽泛接口在测试中的大用处
原文:https://gocn.io/publish/article/368考虑测试一个函数:func request(ctx context.Context, hc *http.Client, api string) (err error) { var hreq *http.Request if hreq, err = http.NewRequest("GET", api, nil原创 2017-06-23 17:27:31 · 889 阅读 · 0 评论 -
GOLANG中time.After释放的问题
原文:https://gocn.io/article/403在谢大群里看到有同学在讨论time.After泄漏的问题,就算时间到了也不会释放,瞬间就惊呆了,忍不住做了试验,结果发现应该没有这么的恐怖的,是有泄漏的风险不过不算是泄漏,先看API的说明:// After waits for the duration to elapse and then sends the current time//原创 2017-07-29 11:59:36 · 6469 阅读 · 2 评论 -
GOLANG实现的HTTP转HTTPS的代理
有时候需要将后端的HTTP服务,转成HTTPS,可以用一个代理。 Reamark: 如果是GOLANG的后端服务,可以直接用库go-oryx-lib/https。这个代理支持自签名的证书,也支持letsencrypt的证书。 Remark: Letsencrypt只支持少量域名的情况,比如自己的网站,它会有请求次数限制,另外CA是letsencrypt的,商业用户不适合用。我们有个HTT原创 2017-10-13 12:14:54 · 7656 阅读 · 0 评论 -
GOLANG探测HTTP连接断开
考虑基于HTTP的RPC,或者HTTP服务器主动通知客户端的机制,就是HTTP Long-Polling,意思就是客户端发起一个长连接,服务器阻塞忍住不响应直到:超时,比如5秒后,我们给客户端响应一个keepalive,意思是现在还没有啥事,请继续polling。拿到结果,这个可能是任何时候,比如300毫秒、1100毫秒、2300毫秒拿到一个事件,响应给客户端,实现了有事件异步通知。这样客户端原创 2017-11-22 12:25:04 · 7833 阅读 · 1 评论 -
GO环境设置
关于go的特点,参考:http://blog.csdn.net/win_lin/article/details/18236737GO环境下载linux 64位的go的包:https://storage.googleapis.com/golang/go1.3.3.linux-amd64.tar.gz 其他参考:http://www.golangtc.com/download解压后移动到/urs/lo原创 2015-09-07 14:48:18 · 3934 阅读 · 1 评论 -
GOLANG接口适配,组合方式的灵活接口演化
原文:https://gocn.io/article/326在OO(Object Oriented)原则中,有一条叫做:优先使用组合,而不是继承。虽然GOLANG并不是OO的语言(没有继承和多态),但是不妨碍GOLANG使用这条原则,而GOLANG的作者就强调过这一点,在GOLANG中是使用组合而非继承来扩展。装逼的说来,继承是一种名词化的语言体系,先进行业务抽象然后设计类体系和继承关系。而组合,强原创 2017-05-15 20:54:06 · 1878 阅读 · 0 评论 -
GOLANG简单类型定义,在协议解析的妙用
在协议解析中,经常需要用到转换不同的含义,比如声音的采样率,在FLV中定义和AAC中定义是不同的。在FLV中只有4中采样率5512, 11025, 22050, 44100。而在AAC中有16种采样率96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350(还有4个是保留的)。也就原创 2017-05-11 15:41:54 · 4013 阅读 · 0 评论 -
[GoBlog] Defer, Panic, and Recover
The Go Programming LanguageDocuments Packages The Project Help Blog Next articleGo Wins 2010 Bossie AwardPrevious articleShare Memory By CommunicatingLinksgolang.orgI转载 2016-07-12 10:53:00 · 758 阅读 · 0 评论 -
论golang的文档即代码
GO TEST如果提供一个库,或者提供了一个模块,如何给使用者描述这个API的用法?一般都是给文档,但是文档非常容易不同步,在golang中,有更高级的做法,也是最好的做法。以go-fdkaac为例,这个是一个go binding,调用了lib-fdkaac的c函数,提供aac的codec的一个库。首先,因为设计到了如何下载fdkaac的c代码和编译,需要在doc中说明,也就是README.md中说原创 2016-06-22 17:13:40 · 1483 阅读 · 0 评论 -
golang的bufio用于内容解析
golang提供了io.Reader,也就是读内容,可以从很多地方读,譬如:// from string.var r io.Reader = strings.NewReader(string("hello, world"))// from bytes.var r io.Reader = bytes.NewReader([]byte("hello, world!"))// from bytes原创 2016-01-03 14:10:01 · 7549 阅读 · 0 评论 -
GO比较容易混淆的地方
GO比较容易混淆的地方GO在nil判断等方面容易混淆。nilGO的nil是带类型的,可以参考相关的文章。看下面的代码:import ( "io" "fmt")type MyWriter struct {}func (w *MyWriter) Write(p []byte) (n int, err error) { return}func main() { va原创 2015-11-30 10:46:32 · 1223 阅读 · 0 评论 -
GOLANG比较方便的地方
GO类型系统GO中很方便在基本类型上定义新的类型,这个虽然是个小东西,但是有时候非常好用。IsXXX经常需要定义这样的函数,譬如RTMP的消息IsAudio,IsVideo等等。如果是C++就需要定义个结构体,然后加函数:class SrsCommonMessage{public: SrsMessageHeader header;};class SrsMessageHeader{p原创 2015-11-20 10:22:43 · 8847 阅读 · 0 评论 -
GO备忘录
GO备忘录GO是C之后一门难得有鲜明特色的语言,不仅仅是一些语法糖,确实解决问题的思路,想法是不太一样的。这篇文章是我看到的,和用到的,一些常见的GO的备忘录,但是有的地方不仅仅局限于用法,而是汇总一个专题。errorGO的error错误对象GO只要实现了error接口,就可以是一个error对象了。常见的是项目有全局的错误对象,就像错误码一样,返回错误对象,比较错误是否是某个错误对象。var Er原创 2015-09-07 14:42:09 · 3064 阅读 · 0 评论 -
golang的局部作用域和变量推导
很多人喜欢golang的接口,不用声明就可以实现;但我更喜欢golang的变量推导和if表达式,看下面一段代码: var ok bool var vhost *SrsVhost if vid,err := bravo_json_get_number(stream, "vhost"); err != n原创 2015-04-02 17:28:49 · 2388 阅读 · 0 评论 -
GO的TCP性能测试,优化结果
之前做过一次测试,没有rrh原创 2014-11-22 13:18:45 · 9512 阅读 · 8 评论 -
GO性能测试:未进行任何优化
srs.go中对于GO的tcp模块,以及web服务器martini做了初步的性能测试,没有rr原创 2014-11-03 18:02:44 · 8833 阅读 · 1 评论 -
GO环境设置
关于go的特点,参考:http://blog.csdn.net/win_lin/article/details/18236737原创 2014-10-30 14:01:34 · 2573 阅读 · 0 评论 -
为何没有单元测试就没有高质量代码?
写代码的几乎都不写单元测试,写单元测试的几乎都是被逼无奈。只有当自己的目标是写自己的软件,质量当然是最重要,而且没有时间x原创 2014-07-05 11:29:14 · 1519 阅读 · 0 评论 -
GO和C++代码对比,GO少个25%代码
C++项目:https://github.com/winlinvip/simple-rtmp-serverGO项目:https://github.com/winlinvip/go.rtmp https://github.com/winlinvip/go.srsRTMP最底层流解析,chunk读取头信息,GO:161行 C++: 211行GO比C++少个50行,主要是数组操作,原创 2014-02-15 19:28:05 · 2492 阅读 · 2 评论 -
GO语言特点
抽时间看看Google的GO语言到底有什么特点。Go说得是不错,自从C依赖,N年没有一个经典的编程语言了,计算机发展了几十年,语言还是C的那一套,是该有所作为了,做起来真的不容易啊。看看GO到底有哪些地方做的很好。编译打包python很好,只是依赖于python环境,譬如CentOS5.5上是Python2.5,还没有json。。。如果在CentOS6上开发的.py,直接放到CentO原创 2014-01-13 22:35:27 · 4268 阅读 · 0 评论 -
开源日志:关于GO语言的资料汇总
Rob Pike谈Google Go:并发,Type System,内存管理和GC概要 Rob Pike谈Google Go,内容涉及:无类OOP编程、Go的接口、采用Goroutines和Channels的并发特性,以及Go中帮助缩短GC间歇的一些特性。 个人简介 Rob Pike是Google的首席工程师。最近,他参与开发了Go语言。在此之前,Rob在贝尔实转载 2012-11-08 09:13:04 · 3115 阅读 · 0 评论 -
关于GOLANG的chan
GOLANG CHANchan是golang中非常重要的一个东西,用来做goroutine的通信,因为golang程序必然会有多个goroutine,如何同步这些goroutine就很重要了。使用chan时有几个心得:首先,永远是符号<-进行读取或者写入,譬如v,ok := <-c是读取,而c <- v是写入。其次,读取时,如果没有ok,也是可以读取的。不过如果closed也是能读的,没有赋值而原创 2016-08-06 23:31:22 · 6253 阅读 · 0 评论