Go的函数参数总是传值

依照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.

阅读全文

深入Go UDP编程

用户数据报协议(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)和某些影音流服务等等。

UDP报头
偏移字节0123
字节 0 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031
00来源连接端口目的连接端口
432报长检查码

IPv4伪头部

0 – 78 – 1516 – 2324 – 31
0来源地址
32目的地址
64全零协议名UDP报文长度
96来源连接端口目的连接端口
128报文长度检验和
160+ 
数据
 

IPv6伪头部

0 – 78 – 1516 – 2324 – 31
0来源地址
32
64
96
128目的地址
160
192
224
256UDP报文长
288全零下一个指针位置
320来源连接端口目的连接端口
352报文长校验和
384+ 
数据
 

以上大段的背景介绍引自维基百科。

而TCP是面向连接(connection-oriented)的协议,可以提供可靠的数据传输。

本文讲介绍Go语言的UDP库及其使用方法,以及了解使用过程中的细节和陷阱。

阅读全文

godef的一个bug

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行增加一个判断。

1
2
3
4
5
6
7
name, err := p.pathToName(litToString(path), filepath.Dir(filename))
if litToString(path) == "C" {
//下面三行新为修改这个bug新增加的行
if name == "" && litToString(path) == "C" {
name = "C"
}
if name == "" {

这样你的godef就可以正常工作了。

另外,如果你升级到Go1.7发现vscode代码自动完成功能不起作用的话,可以尝试在终端中执行gocode close,这个bug可以参考:441

update on 2017-03-16:
查看相关的isses: #856#496#662#440 #442 #515 #567 #459 #517 #667

#706

你可以使用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 模板嵌套最佳实践

Go 官方库提供了两个模板库: text/templatehtml/template。这两个库类似,只不过 html/template对html格式做了特别的处理,当需要输出html格式的代码时需要使用html/template

使用模版,可以帮助我们写一些通用的代码,或者提供清晰的文件布局, 或者提供一个代码生成器。

官方文档提供了很好的模版的使用方法, 其中 text/template提供了基础的模版的使用方法,比如 Action、 Argument、Pipeline、Variable、Function、模版嵌套的介绍, html/template对 Context 进行了介绍。 本文假定你已经了解了这些基础知识。如果你还不清楚,或者还没有用过模版,可以参考文末的参考文档进行学习。

虽然text/template官方文档对模版嵌套简单了介绍,但是对于如何使用嵌套模版进行实际开发,以及注意事项并没有详细的介绍,所以本文着重介绍嵌套模版的使用。

阅读全文

[转]DNS 原理入门

转自 阮一峰 的 DNS 原理入门

DNS 是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点它的知识。
本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作。我的目标是,读完此文后,你就能完全理解DNS。

阅读全文

[转]CDN的原理以及其中的一些技术

这是 Xu Ruochen 总结的通过DNS实现的CDN的一篇条理清晰的文章, 原文链接: CDN的原理以及其中的一些技术

CDN,全称Content Delivery Network,主要作用是为源站减少访问压力的同时,为客户端提供更快速的内容响应。除此之外,CDN还能对源站进行安全防护。 其实真正为CDN付费的是源站,所以CDN的用户其实是源站,例如新浪微博,youku视频,淘宝网啊之类的。而客户端,是CDN的用户的用户。 所以CDN是夹在源站和源站的用户之间的,以下称客户端均指源站的用户。

阅读全文