为 Ruby 程序员准备的 Go 入门教程

那些在Google的大牛们开发出了一种称为Go的牛叉的语言。乍一看,Ruby和Go有点像远房表亲。其实不然,他们那些互为补充的功能却让他们成为一对完美组合。 Ruby程序员花时间了解一下Go还是非常有好处的,因为Go语言中一些创新之举还是很不错的。 对于我来说,Go弥补了C++和Ruby之间空缺的联系。特别是当需要实现高响应的服务器的时候,我通常会选择C++,但是这样我就丢失了Ruby的精细之处。虽然我比较偏爱Ruby,可是即便是最近,当需要性能有明显提高的时候,Ruby还是应付不来。 Go弥补...阅读全文

开源中国翻译 2014-10-10 08:00:02 Mitisky

Go 1.3+ 编译器变革

概述 目前Go编译器是C写的,是时候换成Go啦。 背景 “gc"Go工具链来自Plan 9编译器的工具链。组装器、C编译器和链接器基本没变。Go的编译器(cmd/gc,cmd/5g,cmd/6g,cmd/8g)是配合工具链写的新的C程序。 项目起始时,用C而不是Go写编译器有很多好处。突出的比如,首先,那时候Go还不存在,没法儿写编译器。而且实际上,就算存在,也会经常有明显的不兼容的变化。用C不用Go可以避免初始和持续开发导致的问题。然而如今Go 1已经稳定,所以这些持续的问题减少了很多。 傅小...阅读全文

开源中国翻译 2014-10-10 08:00:02 傅小黑, 偃鼠饮河

Go 并发模型:管道和取消

简介 Golang的原子并发特性使得它很容易构造流数据管道,这使得Golang可有效的使用I/O和多CPU特性。本文提出一些关于管道的示例,在这个过程中突出了操作失败的微妙之处和介绍处理失败的具体技术。 什么是管道 在Golang对于管道没有明确的定义;它只是许多种并发程序中的一种。管道是通道连接的一系列阶段, 每个阶段是一组goroutine运行相同的功能。在每个阶段,goroutine运行步骤为: 从上游经过入境通道接受值 对数据执行一些功能操作,通常会产生新的值 从下游经过出境通道发送值 ...阅读全文

开源中国翻译 2014-10-10 08:00:02 漠天, 徐继开, yxrykd 等

在 Go 语言中,正确的使用并发

Glyph Lefkowitz最近写了一篇启蒙文章,其中他详细的说明了一些关于开发高并发软件的挑战,如果你开发软件但是没有阅读这篇问题,那么我建议你阅读一篇。这是一篇非常好的文章,现代软件工程应该拥有的丰富智慧。 从多个花絮中提取,但是如果我斗胆提出主要观点的总结,其内容就是:抢占式多任务和一般共享状态结合导致软件开发过程不可管理的复杂性, 开发人员可能更喜欢保持自己的一些理智以此避免这种不可管理的复杂性。抢占式调度对于哪些真正的并行任务是好的,但是当可变状态通过多并发线程共享时,明确的多任务合...阅读全文

开源中国翻译 2014-10-10 08:00:02 漠天, LeoXu, 赵亮-碧 等

产品环境中 Go 语言的最佳实践

在SoundCloud,我们为客户构建了产品的API。或者说,我们主要的网站、手机客户端和手机应用是该API的第一批客户。该API背后是一个领域性的服务:SoundCloud基本上以面向服务体系结构的形式运作。 我们也是通晓多种语言的组织,因为我们使用了很多语言。并且这些服务(和基础设施支持)的许多部分是使用Golang开发的。事实上,我们都是早期Golang的使用者:目前,我们已在产品中使用Golang有两年半的时间。相关项目包括: Bazooka,我们内部服务平台;产品思想非常类似于Kero...阅读全文

开源中国翻译 2014-10-10 08:00:01 漠天, 赵亮-碧海情天, An 等

goread安装配置

goread 安装配置 系统ubuntu 13.04 web服务器apache https://github.com/mjibson/goread 安装步骤 这个就不详细说了,可以看他的README,只大概说一下 1.安装python2.7并确保其在PATH中 2.安装Git,Mercurial并确保git and hg 在PATH中 3.安装GO App Engine SDK并确保其在PATH中,这个的简单说一下,把zip包下载下来,然后解压到一个目录,然后把这个目录加入到PATH中即可. 4...阅读全文

开源中国博客 2014-10-10 01:29 __蜗牛__

构建一个可测试的 Go Web 应用

几乎每一个程序员都赞同测试是重要的,但测试以多种方式让写测试的人员打退堂鼓。它们可能运行慢,可能使用重复的代码,可能一次测试得太多导致难以定位测试失败的根源。 这篇文章中,我们将讨论如何设计 Sourcegraph的单元测试,使其简单易写,容易维护,运行快速并可以被其他人使用。我们希望这里提到的一些模式有助于其他写Go web app的人,同时欢迎对于我们测试方法的建议。在开始测试之前,先来看看我们的框架概览。 鑫鑫鑫翻译于 4 天 前 0人顶 顶 翻译的不错哦! 框架 和其他web app一样...阅读全文

开源中国翻译 2014-10-10 08:00:00 鑫鑫鑫

把一个字符串中的字符从小写转为大写

将字符串里面的英文小写转成大写,是一个很简单的操作。每个字符的编码可以认为是整数,Golang里面的byte和rune是uint8和int32。其它语言大同小异。在编码表当中,位置是是从A到Z,接着是a到z,A对应的整数是65,a对应的整数是97,中间差了26个英文字母和6个其它字符的长度共32。所以转换的方法就是,将小写字母的值,剪掉32即可。 还是编码的问题。最早的出现的编码是ASCII,从128个增加到256个字符。再到后面的Unicode、GBK等,这些新出的编码和最早的ASCII都是兼...阅读全文

Golang通过反射实现结构体转成JSON数据

Golang的结构体可以增加类似于Java里面@JsonProperty("id")注释。在结构体里面通过反引号包含的字符串被称为Tag。 type Cyeam struct { Url string `json:"url"` Other string `json:"-"` } 在Tag里加入对json的Tag的定义,就可以实现对输出的格式控制。而且,如果json字段的Tag定义为-的话,不会被解析。 这么强大的功能,借助reflect包,实现起来也不难。 c := Cyeam{Url: "bl...阅读全文

Golang 性能忽然增加变慢10倍的现象,推测是编译器在spilt stack,导致的问题

本测试分别执行三种测试: 1.程序嵌套调用时使用int; 2.程序嵌套调用时使用int+string; 3.程序嵌套调用时使用int+interface{}; 测试脚本如下: // stackSplitTest package main import ( "fmt" "time" ) //测试函数嵌套多少次后,进行runtion.stackSplit,导致运行效率急剧下降 var C = make(chan int, 100) var F = "嵌套次数%5d,From=%5d,To=%5d,G...阅读全文

开源中国博客 2014-05-06 10:59 wkh

Erlang和Golang的几点粗浅的比较

我最早使用的语言是Java和Python, 并且一直都对Python充满好感, 我喜欢这种很朴实和高效率的感觉, 但我却最后没有采用Python,原因其实也很简单, 我就是不喜欢缩进语法, 就跟很多人换工作仅仅是为了屏幕更大一点一样, 另外就是有了同样很棒的可选方案, 这就是Ruby, 所以我最终采用了Ruby作为主力编程语言, 同样也为不能使用Python而有一点小遗憾,毕竟Python的健壮性比Ruby好很多,只不过Ruby也一直在进步, 所以这一点无伤大雅 我们都知道,无论是Python还...阅读全文

CSDN博客 2014-09-19 11:15 educast

Go语言学习笔记3——控制语句

有人说,程序是这个世界上最简单的东西,因为你只需要知道if、for、switch就足够了。事实上,程序也是由判断和循环两种语句组成。程序员更喜欢和机器打交道,而不是和人打交道,是因为程序的世界里更简单,更单纯,没有复杂的关系,是1不会为0、是真也不会为假,一切的一切都是那么真实,不虚幻。此刻,我坚信技术宅们比谁都了解这个世界,比谁都看得更清楚,所以他们将自己宅起来,出淤泥而不染吧。 开门一段土嘈完后,发现本文没有什么好写的了。控制语句不就"判断和循环"吗? 写过”hello,world“的人,没...阅读全文

CSDN博客 2012-03-02 21:13 Marcky

Golang源码剖析——字符串查找算法

发现好多笔试题,都问的是库函数。往简单的做,有效率不太高的算法,往复杂的做,就得看源码了。 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数 暴力字符串匹配方法(Brute forceing matching)。这个写法不难,复杂度O(n*m)。 func IndexFuck(s, sep string) int { for i := 0; i < len(s); i++ { if s[i] == sep[0] { is := true j := 0 for ; j < len(se...阅读全文

Golang——append的可变参数

合并slice,跟合并数组一样,是比较常见的操作。映像中C++运算符重载以后,直接用加号就可以了。Golang果断不行。先开始用copy解决。 func copy(dst, src []Type) int 从来没用过这个函数,返回值和append还不一样,返回的是复制的数目。而且只能针对slice操作,不支持其他类型。能参数表也能看出,两个参数必须是同一种类型,不可以是[]Type和[]interface{}这种形式。此函数也不是追加到dst后面,而是从头开始复制。如果要追加到后面,还需要指出位...阅读全文

Golang——for循环的两种用法

从大一开始学C++,所接触过的for循环只有一种方式,for (int i = 0; i < count; i++) {...}。后来接触了Java,知道Java 5 引入了一种新特性,可以通过for (a : aa)遍历整个数组。虽然知道,但是也没用过,因为之前那种方法足够了。 现在主力语言是Go。Go也支持传统的写法for i := 0; i < count; i++ {...}。同样,还有一种for i, a := range aa {...}。这个跟Java相比,除了能够遍历,还能得到当...阅读全文

Golang——json数据处理

今天让官方文档虐了几条街。 需要能够对JSON数据进行编码,将内部的中文字符串转成Unicode编码。编码这种东西接触也不少了,随便搜一下就能解决。果断去搜了一下。本文所有编码 rs := []rune("golang中文unicode编码") j := "" html := "" for _, r := range rs { rint := int(r) if rint < 128 { j += string(r) html += string(r) } else { j += "\\u" +...阅读全文

布隆过滤器

这篇文章可能涉及到一些拓扑知识,可以参考之前的文章: 常见哈希函数FNV和MD5 Golang binary包——byte数组如何转int? 布隆过滤器的原理不算复杂。对数据进行查找,简单点的可以直接遍历;对于拍好顺序的数据,可以使用二分查找等。但这些方法的时间复杂度都较高,分别是O(n)和O(logn)。无法对大量乱序的数据进行快速的查找。 哈希,将给定的数据通过哈希函数得到一个唯一的值,此值可以作为数据的唯一标识,只要通过该标识,再通过哈希函数逆向计算,就能还原出来原始的数据。在前面的网址压...阅读全文