存档:

文章标签 ‘Go’
2

从零到 Go:24 小时内登上 Google 主页的 Go 语言应用“火鸡”doodle 开发纪实

2011年12月15日

本文是 Google 搜索团队软件工程师 Reinaldo Aguiar 发表在 Go 语言博客的客座文章,他分享了在一天之内完成首款 Go 程序的开发并发布给数百万受众的经历。

我最近有幸参与了一项虽小却曝光率极高的“20% 项目”——2011 年感恩节的 Google Doodle这幅 doodle 中的火鸡由不同样式的头、翅膀、羽毛与爪子随机组合而成。用户可以通过点击火鸡的不同部位自定义组合。这种互动通过 JavaScript、CSS 实现,由浏览器实时渲染出各种火鸡。

用户制作出的个性化火鸡可以分享到 Google+ 上。点击“分享”按钮(图中未给出)即可在用户的 Google+ 流中生成一篇含有火鸡图片的帖子。要满足这种需求,图片必须是单独一张,且与用户所制作的火鸡完全相同。

由于火鸡的八个部位(头、双爪、几片羽毛等)各有 13 种样式,用户可能设计出八亿多种火鸡。预先制作好八亿多张图片显然行不通。因此,必须在服务端实时生成图片。出于即时扩展性与高度可用性的共同需求,合适的平台非常明显:Google App Engine!

接下来要决定的就是选用哪款 App Engine runtime 了。图像处理任务极度依赖 CPU,所以这种情况下性能是决定性因素。

为确保可靠,我们首先进行了测试。我们为新版 Python 2.7 runtime(该版本提供基于 C 的图像处理库 PIL)与 Go runtime 准备了一些等效的演示应用。各应用 分别合成几张小图片生成图像文件,编码为 JPEG,并将 JPEG 数据作为 HTTP 响应发回客户端。Python 2.7 应用处理请求的中位响应时间为 65 毫秒,而 Go 应用的中位延时仅为 32 毫秒。

因此这成为了试用 Go runtime 的大好机会。

此前我对 Go 语言毫无经验,而时间又很紧:两天内达到生产需求。虽然紧张,我还是将它视作从另一常被忽略的方面——开发速度——测试 Go 的机会。完全没有 Go 语言开发经验的人能在多快的时间内掌握并开发出高性能高扩展性的应用?

设计

基本步骤是在 URL 中编码火鸡各态、实时绘制并编码图像。

各 doodle 的基础是背景图画:

有效的请求 URL 形如:http://google-turkey.appspot.com/thumb/20332620

/thumb/ 后面跟着的数字字串(十六进制)代表各外观元素要绘制的形状,如下图所示:

程序的请求接管器解析 URL 决定各组件所选定的元素,在背景上绘制对应图像,并返回 JPEG 成品。

如果出错则返回默认图像。不必返回错误页面,因为用户不可能看到——浏览器肯定是在加载 image 标记中的 URL。

实现

在软件包层面,我们声明了一些数据结构,描述火鸡的各个元素、对应图像所在文件夹,以及各图像应绘制在背景图上的位置。

var (
    // 各外观元素存储位置的文件夹映射。
    dirs = map[string]string{
        "h": "img/heads",
        "b": "img/eyes_beak",
        "i": "img/index_feathers",
        "m": "img/middle_feathers",
        "r": "img/ring_feathers",
        "p": "img/pinky_feathers",
        "f": "img/feet",
        "w": "img/wing",
    }

    // urlMap 映射各 URL 字符与所对应的外观元素。
    urlMap = [...]string{"b", "h", "i", "m", "r", "p", "f", "w"}

    // layoutMap 映射各外观元素与在背景图像上的位置。
    layoutMap = map[string]image.Rectangle{
        "h": {image.Pt(109, 50), image.Pt(166, 152)},
        "i": {image.Pt(136, 21), image.Pt(180, 131)},
        "m": {image.Pt(159, 7), image.Pt(201, 126)},
        "r": {image.Pt(188, 20), image.Pt(230, 125)},
        "p": {image.Pt(216, 48), image.Pt(258, 134)},
        "f": {image.Pt(155, 176), image.Pt(243, 213)},
        "w": {image.Pt(169, 118), image.Pt(250, 197)},
        "b": {image.Pt(105, 104), image.Pt(145, 148)},
    }
)

上述各点的几何位置是通过图像中各元素的实际位置而得到的。

每次请求都从磁盘加载图像是很浪费的重复行为,因此我们在收到首个请求时就将全部 106 幅图像(13×8 个元素 + 1 幅背景 + 1 幅默认图)加载到全局变量中。

var (
    // elements 映射各外观元素及其图像。
    elements = make(map[string][]*image.RGBA)

    // backgroundImage 含背景图像数据。
    backgroundImage *image.RGBA

    // defaultImage 是出错时返回的图像。
    defaultImage *image.RGBA

    // loadOnce 用于仅在首次请求时调用 load 函数。
    loadOnce sync.Once
)

// load 函数从磁盘读取各 PNG 图像,并存储到对应的全局变量中。
func load() {
    defaultImage = loadPNG(defaultImageFile)
    backgroundImage = loadPNG(backgroundImageFile)
    for dirKey, dir := range dirs {
        paths, err := filepath.Glob(dir + "/*.png")
        if err != nil {
            panic(err)
        }
        for _, p := range paths {
            elements[dirKey] = append(elements[dirKey], loadPNG(p))
        }
    }
}

请求按下述顺序处理:

  1. 解析请求 URL,按顺序解码出各字符的十进制值。
  2. 为背景图像创建副本,作为最终图像的基础。
  3. 在背景图像上绘制各图像元素(使用 layoutMap 判断应绘制的位置。)
  4. 将图像编码为 JPEG
  5. 将 JPEG 直接写入 HTTP 响应写入器中,将图像返回给用户。

如果出错,则将 defaultImage 返回给用户,并在 App Engine 控制台记下日志,供日后分析之用。

下面是含说明注释的请求接管器代码:

func handler(w http.ResponseWriter, r *http.Request) {
    // Defer 函数可以从错乱中恢复。
    // 恢复时将错误情况记录到 App Engine 控制台并给用户发送默认图像。
    defer func() {
        if err := recover(); err != nil {
            c := appengine.NewContext(r)
            c.Errorf("%s", err)
            c.Errorf("%s", "Traceback: %s", r.RawURL)
            if defaultImage != nil {
                w.Header().Set("Content-type", "image/jpeg")
                jpeg.Encode(w, defaultImage, &imageQuality)
            }
        }
    }()

    // 在首次请求时从磁盘加载图像。
    loadOnce.Do(load)

    // 创建背景副本,作为绘制基础。
    bgRect := backgroundImage.Bounds()
    m := image.NewRGBA(bgRect.Dx(), bgRect.Dy())
    draw.Draw(m, m.Bounds(), backgroundImage, image.ZP, draw.Over)

    // 处理请求字串中的各个字符。
    code := strings.ToLower(r.URL.Path[len(prefix):])
    for i, p := range code {
        // 解码遇到的十六进制字符 p。
        if p < 'a' {
            // 是数字
            p = p - '0'
        } else {
            // 是字母
            p = p - 'a' + 10
        }

        t := urlMap[i]    // 按索引查找元素类型
        em := elements[t] // 按类型查找元素图像
        if p >= len(em) {
            panic(fmt.Sprintf("元素索引越界 %s: "+
                "%d >= %d", t, p, len(em)))
        }

        // 将元素绘制到 m 上
        // 使用 layoutMap 指定其位置。
        draw.Draw(m, layoutMap[t], em[p], image.ZP, draw.Over)
    }

    // 编码为 JPEG 图像并写为响应。
    w.Header().Set("Content-type", "image/jpeg")
    w.Header().Set("Cache-control", "public, max-age=259200")
    jpeg.Encode(w, m, &imageQuality)
}

为简洁起见,这些代码段中我省略了一些辅助函数。完整代码请参阅源码

性能

该图表从 App Engine 控制台截取,展示了发布后的平均请求时间。显然,即使在高负载情况下也没有超过 60 ms,中位延迟时间为 32 ms。考虑请求接管器在处理图像并实时编码,这已经相当快了。

结论

我觉得 Go 语言的语法直观、简单且洁净。我过去常与解析型语言打交道,尽管 Go 是静态类型系统的编译型语言,编写这款应用的感觉却更像是在用动态解析型语言。

开发服务器提供了可以在程序有变动后迅速重新编译的 SDK,所以开发部署与解析型语言一样快。而且非常简单——我只花了不到一分钟就配置好了开发环境。

Go 语言优秀的文档也帮助了我迅速完成开发。文档是从源代码生成的,各函数的文档与相关联的源码直接链接。这不仅可以让开发者迅速理解特定函数的作用,还鼓励开发者深入挖掘软件包的实现,简化了对良好编程风格与规则的掌握。

编写这款应用的过程中,我只参考了三份资源:App Engine 的 Hello World Go 示例Go 软件包文档以及一篇演示 Draw 软件包的博文。感谢开发服务器的迅速部署,以及该语言自身的优异特性,我得以在 24 小时内掌握该语言,并开发出超快、满足生产需求的 doodle 生成器。

应用的完整源码(包括图像文件)可以在 Google Code 项目中下载到。

向设计该 doodle 的 Guillermo Real 与 Ryan Germick 致以特别的谢意。

原文:From zero to Go: launching on the Google homepage in 24 hours

作者: 分类: 故事/传闻 标签: , ,
0

Go 语言盛会 ECUG Con 2011 将于11月19-20日在上海举行

2011年11月8日

ECUG 即 Effective Cloud User Group(实效云计算用户组),关注并发模型与分布式开发的最佳实践,每年都会筹办一次全国性的 ECUG Con 大会,至今年已走过四个年头。

往届 ECUG Con 大会以 Erlang 语言为主要支撑。而从今年开始,大会预计将Go 编程语言为主,无疑是全国首场以 Go 语言为主题的盛宴

之所以有此变化,是因为我们认为,尽管 Erlang 给分布式开发带来了很好的思路,但是距离大规模应用的可能性还很远。Erlang 语言的优点和缺陷同样明显。但是 Go 语言带来了工程上大范围应用的希望。这两门语言有着相同的理念:让分布式开发更容易。Erlang 是这个领域的先河,Golang 则是集大成者。
可以说,Go 语言是近年来语言变革的最重要的里程碑(没有之一)。

——许式伟,ECUG 发起人、Q盘创始人(该站服务端约有十万行 Go 源码)

今年的 ECUG Con 2011 大会将于11月19~20日在上海举行,为期两天。与 Go 相关的议题包括:

其他精彩议题可到大会支持网站查阅。

会议地点定于上海广场长城假日酒店(恒丰路585号,近上海火车站)三楼王朝厅。感兴趣的读者可以报名参会,或到 ecug.org 进一步了解大会情况。

作者: 分类: 其他新闻 标签: ,
3

Google 放出 App Engine 1.5,支持 Go 编程语言

2011年5月11日

Google I/O 2011上,Google正式推出1.5版本的App Engine,带有很多新功能,包括:

  • Backends:允许开发者精确的控制长时间运行的程序实例。没有过期时间,可使用128M至1GB的内存
  • Pull Queues:允许开发者从queue里拉出一个task,好让应用对其进行处理,而不再需要Task Queues了
  • 默认启用High Replication Datastore:所有新应用都可默认启用HRD,价格从0.45刀降低到0.24刀
  • HTTP请求大小增加到32MB
  • Mail API改进:对Mail API做了更严格的限制。首先是邮件必须是从Google Apps或Gmail帐户发出,二是降低了应用每天可处理的收件人,从2000降低到100
  • Code Downloads:扩展了直接下载应用源代码的功能,现在创建者和上传者都可下载
  • 新的runtime:开始试验性的支持Go编程语言

 

Via Google Enterprise Blog

作者: 分类: Google新闻 标签: ,
2

Go 发布自动更新代码所用 API 的 gofix 工具

2011年4月21日

下一版本 Go 在最基础的 Go 软件包方面将包含显著的 API 变更。除非进行更新,采用新版 API,否则实现 HTTP 服务器句柄调用 net.Dial调用 os.Open使用 reflect 软件包的代码将无法编译。随着 Go 语言愈加稳定,发布频率减缓将成为常态。每周的快照版本中都会有 API 变更,部分可能能自动管理;然而,合计起来看,手动更新现有代码的工作量仍然非常得大。

Gofix 是一款减轻更新现有代码工作量的新工具。它读取源文件中的程序,查找对旧版 API 的使用,用当前 API 进行改写,并将程序写回文件。有些 API 变更未保持全部原有功能,所以 gofix 的改写有时并不完美。当无法自动改写旧版 API 时,gofix 将给出警告及文件名与所在行数,开发者可以检查并亲自重写代码。Gofix 负责处理乏味冗长的简单变更,而把真正应该注意的部分留给开发者处理。

每当 API有明显变更时 gofix 的代码都会得到更新,尽可能进行自动转换。如果用户更新到新版 Go 后代码无法编译,只需在源码目录运行一下 gofix。

例如,gofix 可以将出自 fmt/print.go 的这段代码:

switch f := value.(type) {
case *reflect.BoolValue:
    p.fmtBool(f.Get(), verb, field)
case *reflect.IntValue:
    p.fmtInt64(f.Get(), verb, field)
// ...
case reflect.ArrayOrSliceValue:
    // Byte slices are special.
    if f.Type().(reflect.ArrayOrSliceType).Elem().Kind() == reflect.Uint8 {
        // ...
    }
// ...
}

重写为采用新版 API 的代码:

switch f := value; f.Kind() {
case reflect.Bool:
    p.fmtBool(f.Bool(), verb, field)
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    p.fmtInt64(f.Int(), verb, field)
// ...
case reflect.Array, reflect.Slice:
    // Byte slices are special.
    if f.Type().Elem().Kind() == reflect.Uint8 {
        // ...
    }
// ...
}

几乎每行都有微小变更。重写的变更量大,但几乎完全机械化,可以交付计算机处理。

Gofix 的实现离不开 Go 标准库中对将 Go 源文件解析为语法树将语法树打印回为 Go 源代码的支持。 此外,Go 打印库能以官方格式(通常可以通过 gofmt 工具实现)打印程序,可让 gofix 对 Go 程序的机械性更改不造成谬误。实际上,设计 gofmt 的关键动机之一——或许仅次于避免特定花括号放置位置的争论——就是简化重写 Go 程序的工具,如 gofix 的设计。

Gofix 注定成为不可或缺的工具。Go 团队一直使用该工具更新他们自己的项目,甚至是更新 Google 内部的源码树。Gofix 允许用户修复错误或重构包 API 而无须担心转换现有代码的开销。用户也可以对 gofix 进行扩展,来支持他们自己的 API。

via The Go Programming Language Blog

作者: 分类: Google新闻 标签: , ,
2

Brad Fitzpatrick 正式参与到 Go 语言项目中

2011年4月16日

bradfitz

Brad Fitzpatrick 昨天在 Twitter 上宣布,在为 Android 项目效力一年半多后,他现在正式成为 Go 语言项目的全职“地鼠”(gopher)!

Brad Fitzpatrick布莱德·菲兹派翠克)是 LiveJournal 的创始人,还是 memcached 等诸多自由软件项目的作者,2007 年选择加入 Google。OpenIDPubSubHubbub 等项目均有他的贡献。相信 Go 会因为他的到来真正得瑟起来。

顺便补充一个 Go 团队的愚人节恶搞:

Go 语言项目在本月一日发布godoc 命令工具,彰显该项目组对文档的认真态度。且看 mikespook 的译文《Godoc:文档化 Go 代码》。

via 边江

1

Google 积极参与 Linux 基金会协作峰会 2011

2011年4月7日

google_linux

本周,第五届年度 Linux 基金会协作峰会将于 4 月 6日到 8 日在加州旧金山举办,很多 Googler 将出席峰会,其中有几位 Googler 还将发表演讲。

尽管活动仅限受邀者参加,大家仍可观看免费的演讲和小组讨论的视频直播

via Google Open Source Blog
pic via pcdigital

作者: 分类: Google新闻 标签: , , ,
0

Chrome 扩展:Go Playground 和 Chrome Update Notifier

2010年10月5日

golang_play_ground

谷奥读者 chai2010 给我们发来邮件向我们介绍了他的最新作品:Go Playground,这个扩展可以直接在 Chrome 浏览器中以 golang.org 为后台调试 Google 出品的 Go 语言代码。如果你想尝试一下 Go 语言又懒得搭建运行环境的话,完全可以用 The Go Playground 来体验一把。

chrome_update_notifier

Chrome Update Notifier 也是一个同样简单但是非常实用的扩展,这个扩展会在 Chrome 升级后第一时间跳出桌面提醒提示你尽快更新,并且给出官方 blog 的链接,供你查看新版本的具体更新内容。 (via Techdows)

点击进入扩展中心下载 The Go PlaygroundChrome Update Notifier

作者: 分类: Google技巧 标签: , ,
11

35 个你也许不知道的 Google 开源项目

2009年12月28日

Google是支持开源运动的最大公司之一,它们现在总共发布有超过500个的开源项目(大部分都是利用它们的API来完成),本文将列举一些有趣的开源项目,其中很可能有不少你不知道的哦。

文本文件处理:

Google CRUSH (Custom Reporting Utilities for SHell)

CRUSH是为命令行或shell scripts处理特定文字数据而制作的一系列工具,这里有指南

C++库和源代码:

Google Breakpad

一个开源的多平台崩溃报告系统。

Google GFlags

Gflags是一个命令行标记的处理库,它可以替代“getopt()”,其内置对C++的支持比如string。指南在此

Google Glog

Glog库可执行应用级的日志,提供基于C++式的日志API,可用于Linux、BSD和Windows。指南见此

Google PerfTools

这个工具可让开发创建更强大的应用程序,特别是那些用C++模版开发的多线程应用程序,包括TCMalloc, heap-checker, heap-profiler 和cpu-profiler。指南见此还有这里

Google Sparse Hash

非常节省内存的hash-map。指南见此

Omaha - Google Update

Omaha,也就是Google Update,它可以保证你的软件随时升级到最新版本,目前很多Windows下的Google软件都是用Omaha升级的,包括Google Chrome和Google Earth,当然你也可以用于自己的应用程序。指南看这里还有这里

Protocol Buffers

Protocol Buffers是一种可扩展编码序列数据的方式,Google在几乎所有内部RPC协议和文件格式都使用了Protocol Buffers。指南见此它可以用于很多语言而且被一些IDE所支持,比如NetBeans

互联网:

Google Code Pretiffy

这是一个Javascript模块和CSS文件,它可以让HTML页面里的部分源码高亮显示,支持C/C++, Java, Python, Ruby, PHP, VisualBasic, AWK, Bash, SQL, HTML, XML, CSS, JavaScript, Makefiles和部分Perl,不支持Smalltalk和所有的CAML。例子见此

SpriteMe - easy "CSS spirtes"

SpriteMe使你可以更轻松的创造CSS Sprites(俗称雪碧……)就是把网站要用到的图片都堆在一张图片里,用CSS控制调用哪个区域。它有一个自己的官网在这里

Redacisaurus

Reducisaurus是一个压缩CSS和JS文件的网络服务,基于YUI压缩算法,运行于App Engine。

JaikuEngine

JaikuEngine是一个运行于App Engine的微博系统,由jaiku.com运营。要查看移动客户端的源码可以看这里这里还有介绍

Selector Shell

Selector Shell是一个基于浏览器的测试工具,它可以让你看到CSS在不同浏览器里的样式,用Javascript写的,你可以在这里测试

Google Feed Server

Google Feed Server是一个开源Atom发布协议服务,基于Apache Abdera框架,允许开发者快速为当前数据源(比如数据库)配置feed。指南见这里这里

Melange, the Spice of Creation

这个项目的目标是创建出一个适合开源贡献流程的框架,比如Google Summer of Code TM (GSoC)项目。使用这个框架你就可以用Google App Engine来运行Google Summer of Code项目,和其它类似项目比如Google Highly Open Participation TM Contest和GHOP。指南见此

NameBench

它可以查找最快的DNS服务器给你的电脑用,在Mac OS X、Windows和UNIX系统下都有命令行也有用户界面可以帮你测试,这是Google工程师用20%自由时间写出来的。

Rat Proxy

一个半自动化的大型被动网络应用安全审查工具,专为精确的探测而优化,文档在此

TopDraw

Top Draw是一个图形生成程序,使用简单的文字脚本,基于JavaScript编程语言,Top Draw可以创造出非常复杂和有趣的图形。支持Mac OS 10.5以上系统,使用XCode开发。

etherpad

开源的EtherPad,这是一个基于网络的实时合作文档编辑器,这个项目主要是为了演示代码而开发,帮助那些想在自己服务器部署Etherpad的人使用,这里有如何安装的指南。EtherPad使用JavaScript、Java和Comet服务器来建造实时协作服务。

Chromium

Chromium是开源版的Chrome浏览器,Chromium的目标是建立一个新一代的强大网络应用程序,它与Chrome有很多不同之处。这里有指导如何在Linux上编译Chromium

V8 Google's open source JavaScript engine

V8是Google的开源JavaScript引擎,用C++写成,用于Chrome浏览器之上。V8使用ECMAScript的ECMA-262第三版可运行于Windows XP、Vista、Mac OS 10.5和使用IA-32或ARM处理器的Linux。V8可独立运行也可嵌入到任何C++程序里使用,这里有指南

Chromium OS

Chromium OS是开源版的Chrome OS操作系统,提供快速、简单而安全的网络体验,源码在此

Android

Android是第一个免费、开源而且可完全自定义的移动平台,提供完整的堆栈:一个操作系统、中间件和重要的一用应用,它包含丰富的API可以让第三方开发者开发出强大的应用程序。

MySQL工具:

Google MySQL Tools

各种管理、维护和改进MySQL数据库性能的工具,由Google编写,包括:

  • mypgrep.py:一个类似pgrep的工具来管理MySQL连接
  • compact_innodb.py:可导出和重载所有表格的密集型innodb数据文件

Google mMAIM

mMAIM的目标是对MySQL的监控和分析更简单,且可以和任何环境整合使用。它可显示主/从同步状态,一些性能状态,可以返回大量“show”命令的状态等等。

其它:

Stressful Application Test (stressapptest)

Stressful Application Test试图让来自处理器和I/O到内存的数据尽量随机化,以创造出模拟现实的环境来测试现在的硬件设备是否稳定,Google就在使用它,现在是Apache 2.0许可,这里有介绍安装向导指南

Pop and IMAP Troubleshooter

它用于诊断并解决客户端到邮件服务器的连接问题。

OpenDuckBill

Openduckbill是一个Linux下简单的命令行备份工具,可用于监视文件/目录在有变化后是否标记为备份,并传输这些变化到本地备份目录、远程NFS导出分卷或是用rsync命令导出到远程SSH服务器。见安装向导

ZXing

ZXing(发音类似Zebra crossing)是Java的开源多格式1D/2D条码图像处理库,目的是使用内置在手机上的摄像头拍照并对条码进行解码,而不必与服务器通讯,它被用于Android系统。这里有向导支持的设备列表

Tesseract OCR Engine

Tesseract OCR引擎是1995年UNLV Accuracy测试的前三名之一,在1995和2006年之间它的进展不大,但依然是当前精度最高的OCR引擎。这个源码可读取二进制、灰阶或彩色图片并输出文字,内置一个TIFF阅读器可读取非压缩的TIFF文件,增加libtiff后也可读取压缩图片。指南问答

Neatx - Open Source NX server

Neatx是一个开源NX服务,类似NoMachine公司商业的NX服务。NX协议比VNX更强大,它们的区别主要在:

  • NX是X11客户端所以不会发送位图
  • NX可兼容X、VNC和Windows版的Remote Desktop
  • NX可缓存数据
  • NX安装简单

另外一个可选的项目可以看看Google的FreeNx

PSVM

它是这个文件的代码,这是一个SVM的“支持所有核心”的版本,可多机并行运行,实例见此

GO

Google开发的新编程语言,谷奥有报道

The Google Collections Library for Java

这是一系列与Java 5以及更高版本有关的库,Google花钱给买过来了。

Google styleguide

每个主流的开源项目都有它自己的向导形式,比如一系列的演示代码。如果这些代码都按照“Style”的形式来演示,会更友好。

Via 0x1fff Blog

6

Google 新的编程语言 Go 竟然撞车

2009年11月14日

感谢读者 bruceyao 的爆料:

lets-go

Google最新发布的Go语言竟然有人已经用过,2007年还出过书。该老兄已经在Go网站的Issue tracker里面发帖要求自己的权利。该老兄的书在lulu上有卖(上图)。Valleywag说的好,Google在为他们的新语言命名之前忘了google一下了。

不知道Google该如何应对,Go++?oh no...

关于Go今后如何改名,一堆网友已经在Google Codereddit上为Google献计献策,具体情况可以围观酷壳的博客

Via Valleywag

作者: 分类: 故事/传闻 标签: , ,
15

Google 发布新语言 Go

2009年11月11日

感谢读者 江河 的投递:

go

Go定位于系统程序开发。

Google觉的这十几年来,硬件发展迅速,但是程序语言滞后。Google说:M$,你没当好大哥啊,我很生气,后果很严重。我自己搞一个程序设计语言。Let's Go!

Go语言的特色:

  • 简洁
  • 快速
  • 安全
  • 并行
  • 有趣
  • 开源

支 持泛型编程,内存管理,数组安全,编译迅速。开发速度超phtyon-777飞机,运行速度跟c++-320飞机也有的一拼啊!总而言之,言而总之,那是 清纯冷艳并风骚性感妩媚智慧贤惠于一体,凡此种种,不能一一。而且,随便你怎么搞。不爽,引进新技术改善服务;干的爽,不收钱!

Go小姐的相册空间:http://golang.org/

作者: 分类: Google新闻 标签: ,