
译自 tylerchr 的 What's Coming in Go 1.8。
随着Go 1.8 新特性的开发工作已经冻结,Go 1.8 将在2017年2月左右发布,现在让我们看一些在Go 1.8更有趣的API的改变。
译自 tylerchr 的 What's Coming in Go 1.8。
随着Go 1.8 新特性的开发工作已经冻结,Go 1.8 将在2017年2月左右发布,现在让我们看一些在Go 1.8更有趣的API的改变。
集群式、负载均衡的RPC框架 rpcx支持多种的序列化库,可以有效的减少消息体的大小,但是对于字符串或者图片的字节slice,明显还可以进一步的压缩,正如fasthttp作者valyala在他的新的开源项目httpteleport中描述的: 通过1G的带宽传输10G的数据
(夸张)。
为了在RPC的传输中减少传输的数据大小,我在不影响rpcx整体框架的基础上,参考了httpteleport的实现,对net.TCPConn
进行了封装,实现了压缩/解压缩功能的net.Conn
,可以有效的减少带宽,节省公司在带宽上的花费, 以下就是具体的实现。
Visual Code 1.7.1发布了,vscode team提供了一个pdf版本的快捷键指南,可以打印出来备用。
依照Go的FQA, 函数的参数传递总是传值的(pass-by-value):
As in all languages in the C family, everything in Go is passed by value. That is, a function always gets a copy of the thing being passed, as if there were an assignment statement assigning the value to the parameter. For instance, passing an int value to a function makes a copy of the int, and passing a pointer value makes a copy of the pointer, but not the data it points to. (See a later section for a discussion of how this affects method receivers.)
Map and slice values behave like pointers: they are descriptors that contain pointers to the underlying map or slice data. Copying a map or slice value doesn't copy the data it points to. Copying an interface value makes a copy of the thing stored in the interface value. If the interface value holds a struct, copying the interface value makes a copy of the struct. If the interface value holds a pointer, copying the interface value makes a copy of the pointer, but again not the data it points to.
用户数据报协议(User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报(package-oriented)的传输层协议,正式规范为RFC 768。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。UDP在IP数据报的头部仅仅加入了复用和数据校验。
由于缺乏可靠性且属于非连接导向协议,UDP应用一般必须允许一定量的丢包、出错和复制粘贴。但有些应用,比如TFTP,如果需要则必须在应用层增加根本的可靠机制。但是绝大多数UDP应用都不需要可靠机制,甚至可能因为引入可靠机制而降低性能。流媒体(流技术)、即时多媒体游戏和IP电话(VoIP)一定就是典型的UDP应用。如果某个应用需要很高的可靠性,那么可以用传输控制协议(TCP协议)来代替UDP。
由于缺乏拥塞控制(congestion control),需要基于网络的机制来减少因失控和高速UDP流量负荷而导致的拥塞崩溃效应。换句话说,因为UDP发送者不能够检测拥塞,所以像使用包队列和丢弃技术的路由器这样的网络基本设备往往就成为降低UDP过大通信量的有效工具。数据报拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速率UDP流中,增加主机拥塞控制,来减小这个潜在的问题。
典型网络上的众多使用UDP协议的关键应用一定程度上是相似的。这些应用包括域名系统(DNS)、简单网络管理协议(SNMP)、动态主机配置协议(DHCP)、路由信息协议(RIP)和某些影音流服务等等。
偏移 | 字节 | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字节 | 位 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | 来源连接端口 | 目的连接端口 | ||||||||||||||||||||||||||||||
4 | 32 | 报长 | 检查码 |
IPv4伪头部
位 | 0 – 7 | 8 – 15 | 16 – 23 | 24 – 31 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 来源地址 | |||||||||||||||||||||||||||||||
32 | 目的地址 | |||||||||||||||||||||||||||||||
64 | 全零 | 协议名 | UDP报文长度 | |||||||||||||||||||||||||||||
96 | 来源连接端口 | 目的连接端口 | ||||||||||||||||||||||||||||||
128 | 报文长度 | 检验和 | ||||||||||||||||||||||||||||||
160+ | 数据 |
IPv6伪头部
位 | 0 – 7 | 8 – 15 | 16 – 23 | 24 – 31 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 来源地址 | |||||||||||||||||||||||||||||||
32 | ||||||||||||||||||||||||||||||||
64 | ||||||||||||||||||||||||||||||||
96 | ||||||||||||||||||||||||||||||||
128 | 目的地址 | |||||||||||||||||||||||||||||||
160 | ||||||||||||||||||||||||||||||||
192 | ||||||||||||||||||||||||||||||||
224 | ||||||||||||||||||||||||||||||||
256 | UDP报文长 | |||||||||||||||||||||||||||||||
288 | 全零 | 下一个指针位置 | ||||||||||||||||||||||||||||||
320 | 来源连接端口 | 目的连接端口 | ||||||||||||||||||||||||||||||
352 | 报文长 | 校验和 | ||||||||||||||||||||||||||||||
384+ | 数据 |
以上大段的背景介绍引自维基百科。
而TCP是面向连接(connection-oriented)的协议,可以提供可靠的数据传输。
本文讲介绍Go语言的UDP库及其使用方法,以及了解使用过程中的细节和陷阱。
godef可以打印出Go源代码中的符号,很多集成开发工具都集成了它,并且提供了Go to Definition
的命令和快捷键,可以迅速的跳转到方法和变量的声明的地方,非常的方便。
比如我常用的vscode-go,就提供了这样的功能,但是目前godef有一个bug,就是不能跳转标准库net
包下的方法定义,这个bug已经提交到github上: #18, 大约在6月的时候就发现了这个bug,不清楚作者为什么没有fix,事实上早有人提供了修改的pull request。这个bug产生的原因是godef没有处理好"C"库。
我在这里把修改方法记录一下,你可以手工的修改编译godef。
找到godef文件夹下的parser文件(go/parser/parser.go),在 1970行增加一个判断。
|
|
这样你的godef就可以正常工作了。
另外,如果你升级到Go1.7发现vscode代码自动完成功能不起作用的话,可以尝试在终端中执行gocode close
,这个bug可以参考:441。
update on 2017-03-16:
查看相关的isses: #856、#496、#662、#440 #442 #515 #567 #459 #517 #667
你可以使用gogetdoc
代替godef
,在配置中加上 "go.docsTool": "gogetdoc"
。
或者使用实验性的go-languageServer: "go.useLanguageServer": true
。
虽然微服务架构给开发者带来很大的自由,但是确保服务的可用性却要求对微服务进行很好的架构,运维以及组织标准。
O'Reilly这本免费的电子书Microservices in Production介绍了微服务标准化的挑战,以可用性作为微服务标准化的目标,提出了八个标准化微服务的原则,包括在整个工程组织中实现production-readiness标准的策略。
这本书的作者是 Susan J. Fowler, Uber 的 SRE (site reliability engineer),她在Uber也主要做促使Uber项目中的各个微服务达到产品级的状态,所以这本小书也是她的工作思考之作。
Go官方库的文件操作分散在多个包中,比如os
、ioutil
包,我本来想写一篇总结性的Go文件操作的文章,却发现已经有人2015年已经写了一篇这样的文章,写的非常好,所以我翻译成了中文,强烈推荐你阅读一下。
原文: Working with Files in Go, 作者: NanoDano
Go 官方库提供了两个模板库: text/template 和 html/template。这两个库类似,只不过 html/template
对html格式做了特别的处理,当需要输出html格式的代码时需要使用html/template
。
使用模版,可以帮助我们写一些通用的代码,或者提供清晰的文件布局, 或者提供一个代码生成器。
官方文档提供了很好的模版的使用方法, 其中 text/template
提供了基础的模版的使用方法,比如 Action、 Argument、Pipeline、Variable、Function、模版嵌套的介绍, html/template
对 Context 进行了介绍。 本文假定你已经了解了这些基础知识。如果你还不清楚,或者还没有用过模版,可以参考文末的参考文档进行学习。
虽然text/template
官方文档对模版嵌套简单了介绍,但是对于如何使用嵌套模版进行实际开发,以及注意事项并没有详细的介绍,所以本文着重介绍嵌套模版的使用。