Tag: golang

  • Function call by name in Golang

    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 PHP codes:

    function foobar() {
        echo "Hello Golang\n";
    }
    $funcs = array(
        "foobar" => "foobar",
        "hello"  => "foobar",
    );
    $funcs["foobar"]();
    $funcs["hello"]();
    

    It will print:

    mikespook@mikespook-laptop:~/Desktop$ php foobar.php 
    Hello Golang
    Hello Golang
    

    (more…)

  • [翻译]大道至简(原标题:少是指数级的多)

    原文 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++ 也仍然完全跟得上主题。

    (more…)

  • Golang:有趣的 channel 应用

    严格意义上说,本文是我另外一片文章《Golang Funny: Play with Channel》的中文版本。不过,毕竟是用中文当母语的,所以就不翻译了,重新按照那个内容写过吧。

    channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。

    这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述:

    信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。

    这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 channel 是一个管道或者先进先出队列,非常简单且轻量。channel 并不是 Golang 首创的。它同样作为内置功能出现在其他语言中。在大多数情况下,它是一个又大、又笨、又复杂的消息队列系统的一个功能。

    下面就来一起找点乐子吧!

    (more…)

  • [翻译]用 Go 实现零停机升级 TCP 服务

    零停机升级几乎是现代网络服务的标配,其实现原理并不复杂……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 中是否能做到同样的事情,以及对于标准库需要做什么样的修改来达到这个效果。最终我实现了这个功能,而且只需要很小的修改,接下来会解释一下是如何做到的。

    (more…)

  • Golang Funny: Play with Channel

    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 can think of it as a PIPE or a FIFO queue. It’s lightweight and simple. Channel is not of Golang origin. It also appears in some other languages(embedded). And most of time, it’s a function as a part of a huge, complexly and heavy message queue system.

    OK! Let’s have some fun.
    (more…)

  • MyMySQL 的 database/sql 接口使用

    最近看到不少朋友对 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 的项目,对 MyMySQL 打上相应的补丁。主要是针对编码设置进行了改进,并顺便实现了 keepalive 功能。

    本文主要介绍 fork 的版本的使用。
    (more…)

  • [翻译]Go 版本 1 发布

    原文:http://blog.golang.org/2012/03/go-version-1-is-released.html

    —————-翻译分隔线—————-

    Go 版本 1 发布

    今天,在 Go 编程语言的开发上标记了一个主要的里程碑。我们宣布 Go 版本 1,或者简称为 Go 1,定义了一个语言和一系列的核心库作为基础,用于创建可信赖的产品、项目和出版物。
    Go 1 是 Go 的第一个发布,提供了二进制包。可用于 Linux、FreeBSD、Mac OS X 以及,令人非常兴奋的——Windows。

    (more…)

  • [翻译]Go 环境设置

    在最近的 weekly 版本中,golang 已经将大多数操作集成到了 go 这一个工具。并且环境变量的设置也发生了变化。不过蛋疼的是,如果不理解 GOPATH 的真正用法,只会让你蛋碎一地。

    最常见的错误:

    can't load package: .: path "/pla/pla/pla" not inside a GOPATH
    

    这篇文章,简短、清晰的解释了新的 go 环境应当如何设置。

    作者 Frank Müller,原文在此:http://mue.tideland.biz/2012/02/go-environment-setup.html?spref=tw

    (more…)

  • [翻译]go 工具

    go 工具来了,集大成,全整合。没了 Makefile 还真有点不习惯。此文甚好,早就想翻译了,无奈最近焦头烂额……不管怎么样,还是动手了。

    原文要翻墙,访问请谨慎:The go tool

    —————-翻译分隔线—————-

    线上介绍了 go 命令的最新 weekly 发布后,我决定写一些关于它的内容。我得承认,在第一次听说统一 go 工具的时候,我满是怀疑并对此非常恐惧。我担心它会像大多数其他语言特定的包管理器一样混乱。个人认为多数这种包管理器都是在重新发明轮子,并且与操作系统的包管理器发生冲突,让系统管理员生活的更加艰辛。另外,我确实喜欢 makefile,它们简单并且直接,工作得也很好。幸运的是,新的 go 工具驱散了我的恐惧!
    (more…)

  • [翻译]从 r60 到 Go 1

    Go1 发布的日子越来越近,Golang 社区就像将开了的山泉水一样,泊泊的不断传来各种关于 Go1 的声音。
    这篇文章总结得比较完整,很清晰,随即翻译于此。
    原文:http://gophersays.com/from-r60-to-go1/

    —————-翻译分割线—————-

    Go 1 已经到门口了,伙计们,它有许多变化

    这里是关于你必须知道的一些重要事情:

    Go 命令
    新的 map delete 语法
    Error 有了自己的包
    重写的库
    新的库
    (more…)