golang

也许是我比较喜欢接触新东西吧,所以经常会大致看一些之前一点也不知道的语言。当然一个语言是彻底的“新”,那就是go language。没考证go这个名字怎么来的,似乎就是google吧。总之这是google推出的,有几个顶级牛人搞出来的这么一个新的语言。网上说最有代表性的俩人是Rob Pike,Ken Thomason,前面那个不认识,后面那个是发明C language的人之一,跟另一个发明C的人得过图灵奖。

官网是golang.org,目前似乎有用的资料都是出自官网或者有用的资料官网都有,当然也有各国人在做本地化的工作,比如http://code.google.com/p/golang-china/ 就把官网的文档、教程翻译了一部分。当然英语也不难懂,所以直接去官网看就好了。

现在各类编程语言已经很多了,既然搞出来一个新的语言肯定是有其需求的。现在的大多数主流语言都已经有二三十年甚至更久的历史一方面当时的思路不一定应对现在的需求,一方面也受到当时的技术和想法的限制。我们都知道现在各种语言都有他自己的特色,自己的优势通常就是别人的劣势,而别人的劣势就是自己的优势。理论上开发出一个汇集多家优点的语言是可行的,但那也是一个很浩大的工程。目前我知道的也暂时只有google在做,也只有go能算是一个新的思路和希望。

Go的初衷是用于系统编程,效率会放在非常重要的位置。而传统的C因为各种问题虽然有效率但是写着会有各种各样的问题,不像一些其他语言尤其是python一类语言那么方便。因此也有人将go形容为C+python。此外,除了运行效率,编译效率也很重要,似乎现在go的编译速度已经跟C差不太多。

go和c比最大的改进之一就是垃圾回收。C没有,C++因为种种原因虽然有人提过但还是没有列入标准中。go的目标就是提供一个低延迟的垃圾回收器。此外go支持面向对象但不支持继承,因而类的关系变得简单(这也让我重新审视了我被老师灌输的面向对象主要就是继承尤其是多态的思想)。而且数据是静态类型和强类型的,就是定义变量后会固定数据类型不能让它指向其他数据类型而且必须显示的转换不能隐式转换,甚至int和int32之间也不会。然后就是支持像字典之类的原生类型,将python等很方便的地方引入了编译型语言当中。此外go的字符串也是原生的且不是字符数组不能修改。

一些细节的地方就有很多了,各个语言有各个语言的语法特点,go基本属于比较方便的。比如i:=1就同时进行了定义int变量和赋初值,括号的左边面强行要求写在前一行的末尾,语句后面不用写分号等等。

go的指针主要采用“slice”这个概念,这个就有点像python了,至于到底有没有传统指针我现在还不知道,有时间看看。

[3]int{1,2,3}这是一个数组
[…]int{1,2,3}这是一个自动确定大小的数组。
[]int{1,2,3}这就是一个切片
[3]int{1,2,3}[:]这也是一个切片,当然这个更能体现切片的含义。

具体的我还不大了解,只知道数组作为参数是需要以slice的形式作为参数,而且数组本身是一个对象因而无法直接通过第一个数据获得其首地址。用官方的话说,切片比数组更常用,但是切片对内存的绝对控制要差一些。

在申请内存的时候go会区分值对象(int/string)和引用(map/slice),前者用new返回地址,后者用make返回引用。貌似是这个意思,英语不太好。

go可以给任意类型定义方法,甚至是int,这点跟ruby有点像。目前还没看到有用class关键字的,似乎都是struct,而且一般也都是只在里面定义成员,方法都在外部定义——何况任何类型都可以定义方法,也就没必要在内部定义了。

最后就是关于并行计算的,因为我对并行计算本身就不是很了解,所以只能说go的目标是“很好的”支持,起码要比其它的好。顺便说一句,忘了在哪看到的说设计面向对象编程的初衷也是因为解决并行计算的问题,只不过后来逐渐跑题了,不知道是真是假。

大致就是这些吧,吃螃蟹去了(是真去厨房吃螃蟹不是鲁迅说的那个吃螃蟹……)。

最后写下如何使用go:

http://golang.org/doc/install.html

golang目前没有windows版,估计短时间内也不会有。由此也能看出go现在真正在全职开发的人并不多,毕竟是google自己拿钱去为全人类做贡献,从商业角度讲让那些牛人改进下搜索算法显然更有收益……还有就是google也不指望短期内将go推向大众。

首先,编译go需要bison ed gawk gcc libc6-dev make这几个包,有几个是unbuntu不自带的需要额外装。然后

hg clone -r release https://go.googlecode.com/hg/ go

就下载了最新的代码,转到src目录运行all.bash就编译了。有几个环境变量可以改变系统环境——注意不是自己本机的系统而是目标程序的系统——就是说能用一台电脑编译全部平台的程序。默认的都是X86架构,编译器叫8g,链接器是8l,源码后缀名当然是.go了。

据说装完就可以直接用8g等命令,但我这一直不行,改了bin的路径也不行,后来干脆直接用alias 8g=’$HOME/go/bin/8g’解决问题……

注意编译完的文件后缀名是.8,链接后最终文件是8.out。当然可以makefile。

按照惯例,放个helloworld吧。注意官网之所以这么写也是表明go对unicode的支持是非常好的。

package main

import fmt "fmt"  // Package implementing formatted I/O.

func main() {
    fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界n")
}

已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注