跳转到内容

Go

本页使用了标题或全文手工转换
维基百科,自由的百科全书

这是本页的一个历史版本,由140.114.66.110留言2013年10月23日 (三) 12:02编辑。这可能和当前版本存在着巨大的差异。

Go
编程范型编译型, 並發型结构化指令式
设计者罗伯特·格瑞史莫Robert Griesemer英语Robert Griesemer
罗勃·派克Rob Pike
肯·汤普逊Ken Thompson
实现者Google
发行时间2009
当前版本
  • 1.23.3(2024年11月6日)[1]
编辑维基数据链接
操作系统Linux, Mac OS X, FreeBSD
许可证BSD
网站http://golang.org/
主要实现产品
gc (8g, 6g,5g), gccgo
启发语言
COberonLimboNewsqueak[2]

GoGoogle开发的一种编译型並發型,并具有垃圾回收功能编程语言[3]

罗伯特·格瑞史莫Robert Griesemer英语Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,[2],稍后Ian Lance Taylor, Russ Cox加入项目中。Go语言是基于Inferno操作系统所开发的。[4]Go语言于2009年11月正式宣布推出,成为开放原始码项目,并在LinuxMac OS X平台上进行了实现,后追加Windows系统下的实现。[5]

描述

Go语言的语法接近C语言,但是对于变量的声明是不同的,其他语法不同之处是For循环if判断式没有括弧围绕。Go语言支持垃圾回收功能。Go语言的并行模型是以东尼·霍尔CSP为基础,采取类似模型的其他语言包括occamLimbo[2],但它也具有Pi运算的特征,比如通道传输。

与C++相比,Go语言并不包括如异常处理继承泛型断言虚函数等功能,但增加了slice型、并发、管道、垃圾回收、接口(interface)等特性的语言级支持[2]。当然,Google 对于泛型的态度还是很开放的,但在该语言的常见问题列表中,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。不同于Java,Go语言内嵌了关联数组(也称为哈希表(hashes)或字典(dictionaries)),就像字符串类型一样。

实现

当前有两个Go语言的编译器的分支。gccgo和6g/8g/5g,其中6g/8g/5g分别代表64位、32位及Arm架构编译器。下面看编译的代码:6g编译器使用:

 $ 6g helloworld.go  # 把原始码编译到 helloworld.6 这个 object file
 $ 6l helloworld.6   # 把所需的 object files 給連結起來,輸出可執行檔到 6.out
 $ ./6.out
 Hello, world; or 你好世界
 $

gccgo 编译器使用:

 $ gccgo helloworld.go
 $ ./a.out
 Hello, world; or 你好世界
 $

6g(X86-64)、8g(X86)、5g(arm) (及其支持工具,总称为gc)用C写成,使用yacc/Bison作为解析器。Gccgo是一个使用标准GCC作为后端的Go编译器[6]

示例

下面是用Go语言写成的Hello World程序。

package main

import "fmt"

func main() {
	fmt.Println("Hello, World")
}

下面的例子说明了怎样用Go语言去实现一个像Unix中的 echo命令的程序[7]

package main

import (
	"os"
	"flag" // command line option parser
)

var omitNewline = flag.Bool("n", false, "don't print final newline")

const (
	Space   = " "
	Newline = "\n"
)

func main() {
	flag.Parse() // Scans the arg list and sets up flags
	var s string = ""
	for i := 0; i < flag.NArg(); i++ {
		if i > 0 {
			s += Space
		}
		s += flag.Arg(i)
	}
	if !*omitNewline {
		s += Newline
	}
	os.Stdout.WriteString(s)
}

同名争议

2003年发表的编程语言Go!,名称与Go雷同。

参考文献

外部链接