Blog

  • 这篇文章虽然不长,但是很有趣。看到好几天了,一直都没空翻译。抽空翻译出来,这应当算是英文“标题党”和“高级黑”吧。 原文不好读,也没什么特别的;不过如果是为了强化学习 Golang 的信心,值得看看。 原文在此:http://aeronotix.pl/blog/go-is-boring —————-翻译分隔线—————- 无聊的 Golang Go 没什么新鲜的,也没什么特别的。你在看到 Go 之前都遇到过了。是的,我也是这么认为的。不过你所没见过的是所有这些都集中在一个语言中,产生了一个 TMD 超级有用的核心。

  • 今天是 7.23,早上路遇军车开道的领导车队。晦气! 随得打油诗一首,以慰亡灵…… 本是发在围脖上的,复看,貌似油打得不够酱啊。 随即做了修改,重发于此。 国殇?很忙! 水浸亡魂骨未凉,高铁旧痛犹新伤。 奈何桥上汤一碗,生人心悸故人忘。 无意讽你官家事,朝闻警笛若报丧。 放了天朝八千屁,领导摆手话很忙。

  • 上个星期,我写了篇《Function call by name in Golang》。由于是英文的,所以被人诟病(说谁,谁知道!)。好吧,现在用中文重新写一遍。 Golang 中的函数跟 C 的一样,是个代码块,不过它可以像其他类型那样赋值给一个变量。 如果你对函数不熟悉,《Codewalk: First-Class Functions in Go》应该是个不错的起点。已经有所了解?那么继续吧! 首先,来看看这段 PHP 代码: 它会输出:

  • The golang’s function is a code block like C’s, but it can also be assigned to a variable as its other types. If you are not familiar with the function, Codewalk: First-Class Functions in Go should be a good starting point for you. Already known it? Let’s go on. First of all, look at this…

  • 原文 Less is exponentially more 是 Rob Pike 自己整理的他在六月22日,旧金山的 Golang 会议上的演讲稿。清晰的介绍了 Go 的前世今生,来龙去脉。为了让更多的人能够更加清楚的认识到 Go 的优雅并喜爱上 Go,特翻译成中文,以飧读者。 —————-翻译分隔线—————- 大道至简 这是我(Rob Pike)在 2012 年六月,旧金山 Go 会议上的演讲内容。 这是一个私人演讲。我并未代表 Go 项目团队的任何人在此演讲,但我首先要感谢团队为 Go 的诞生和发展所做的一切。同时,我也要感谢旧金山 Go 社区给我这个演讲机会。 在几个星期之前我被问到,“在推出 Go 之后,什么令你感到最为惊奇?”我立刻有了一个答案:尽管我们希望 C++ 程序员来了解 Go 并作为一个可选的语言,但是更多的 Go 程序员来自如于 Python、Ruby。只有很少来自 C++。 我们——Ken,Robert 和我自己曾经是 C++ 程序员,我们设计新的语言是为了解决那些我们编写的软件中遇到的问题。而这些问题,其他 C++ 程序员似乎并不怎么在意,这看起来有些矛盾。 今天我想要谈谈是什么促使我们创建了 Go,以及为什么本不应该是这样会我们惊讶的结果。我承诺讨论 Go 会比讨论 C++ 多,即便你不了解 C++…

  • 首先要声明:虽然这是互联网行业的一个普遍现象,但本文讨论的内容,与我所在的公司和所从事的行业无关。 事情的起因是在一个讨论 yaf 的 qq 群有人问如何抓取某网站内容,比如这里。我得说,这个网站在防采集和防抓取方面一直做得很出色。当然更出色的是他们运营的内容的价值。 在几年之前,我就探索过这个问题。对内容的数字、标点进行部分图片化,并且不是固定图片。URL 甚至 md5 值都是变化的。那么最基本的思路就是图像内容的识别。 例如这是其中一个放大了 5 倍的数字:。蓝色背景是我手工加上去的,因为还有这样一个图:,你会发现原来同样的内容的图中还会有干扰点和偏移量的存在。那么难道真得要祭出像 opencv 这样的神器吗?其实,用一个采样/阈值匹配的办法,用 php 和 gd 库就可以实现一个简单的图像识别。

  • 严格意义上说,本文是我另外一片文章《Golang Funny: Play with Channel》的中文版本。不过,毕竟是用中文当母语的,所以就不翻译了,重新按照那个内容写过吧。 channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。 这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述: 信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。 这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 channel 是一个管道或者先进先出队列,非常简单且轻量。channel 并不是 Golang 首创的。它同样作为内置功能出现在其他语言中。在大多数情况下,它是一个又大、又笨、又复杂的消息队列系统的一个功能。 下面就来一起找点乐子吧!

  • 零停机升级几乎是现代网络服务的标配,其实现原理并不复杂……blablabla……( 从文件描述符讲起,省略一万字)。现在有人确认 Go 也可实现零停机升级 TCP 服务或者更加简短的叫法——热更新。 原文在此:Zero Downtime upgrades of TCP servers in Go —————-翻译分隔线—————- 用 Go 实现零停机升级 TCP 服务 最近在 golang-nuts 邮件列表上有篇帖子提到 Nginx 可以保持服务的时候进行升级,而无需停止它正在监听的 socket。秘诀是取消监听的 socket 上的 close-on-exec,然后 fork 并运行一个新的服务(用升级后的二进制文件),并用参数告诉它使用继承的文件描述符,而不是调用 scoket() 和 listen(s)。 于是我就想试试在 Go 中是否能做到同样的事情,以及对于标准库需要做什么样的修改来达到这个效果。最终我实现了这个功能,而且只需要很小的修改,接下来会解释一下是如何做到的。

  • Golang have a funny toy: Channel. Here has some words from the specification: A channel provides a mechanism for two concurrently executing functions to synchronize execution and communicate by passing a value of a specified element type. Yep! It is boring and dull. You can’t understand it when you read it first time. Actually, you…

  • 最近看到不少朋友对 Golang 中操作 MySQL 数据库有疑问,那么就此内容给大家分享一下吧。 MyMySQL 的原作者是来自波兰的 ziutek,他根据 MySQL 的协议标准使用 Golang 实现了 MyMySQL 包。根据他的介绍,这个包可以用在 MySQL 4.1 或更高版本上,并且在 5.0、5.1 版本上经过项目的实际验证。 只要用 MySQL 做过项目的朋友一定遇到过编码问题,set names 几乎成为了中文环境下使用 MySQL 的标配。那么 Golang 也不能例外。不过由于 database/sql 使用了随机的连接池,且未提供任何方法让所有连接都执行某个操作,于是这个麻烦事儿就落到了驱动的肩上。对于中文什么的,大老外一向不怎么在意。我提交了这个 issue 给 ziutek,不过对于他最终实现的方案不怎么满意。需要额外编写godrv.Register 来对编码进行设置。 同时当连接空闲时间超出服务器的 wait_timeout 时,会出现 broken pipe。对于这个问题,ziutek 的建议是使用 MyMySQL 的 autorc,但是 godrv 并没有基于 autorc 实现 database/sql。换句话说,要解决这个错误,只能使用 MyMySQL 原始接口。 鉴于这些问题,我只能 fork 了 ziutek 的项目,对…