加入收藏 | 设为首页 | 交流中心 | 我要投稿 | RSS
您当前的位置:首页 > 技术中心 > 高谈阔论

Golang

时间:2017-04-21 17:38:30  来源:  作者:

 hKS快充网络

Go[编辑]

维基百科,自由的百科全书
 
 
Go
Golang.png
编程范型 编译型可平行化结构化指令式
设计者 罗伯特·格瑞史莫Robert GriesemerhKS快充网络
罗勃·派克(Rob Pike)hKS快充网络
肯·汤普逊(Ken Thompson)
实现者 Google
发行时间 2009
最新发行时间 1.8(2017年2月19日,60天前[1]
操作系统 LinuxMac OS XFreeBSDWindows
许可证 BSD
网站 http://golang.org/

Go,为了方便浏览器和识别,部分人称其为Golang,是Google开发的一种静态强类型编译型并发型,并具有垃圾回收功能编程语言[3]hKS快充网络

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

目前 Go 语言基于 1.x 每半年发布一个版本。hKS快充网络

 hKS快充网络

 hKS快充网络

描述[编辑]

Go 语言的语法接近 C语言,但是对于变量的声明是不同的。Go语言支持垃圾回收功能。Go 语言的并行模型是以东尼·霍尔通信顺序进程(CSP)为基础,采取类似模型的其他语言包括OccamLimbo[2],但它也具有Pi运算的特征,比如通道传输。在 1.8 版本中开放 Plugin(插件)的支持,这意味着现在能从 Go 语言中动态加载部分函数。hKS快充网络

与 C++ 相比,Go 语言并不包括如异常处理继承泛型断言虚函数等功能,但增加了 Slice 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持[2]。Google 目前仍正在讨论是否应该支持泛型,其态度还是很开放的,但在该语言的常见问题列表中,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。hKS快充网络

不同于 Java,Go语言内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries)),就像字符串类型一样。hKS快充网络

撰写风格[编辑]

在 Go 语言中有几项规定,而且这些是强制的,当不匹配以下规定时编译将会产生错误。hKS快充网络

  1. 每行程序结束后不需要撰写分号(;)。
  2. 花括号({)不能够换行放置。
  3. IF 判断式和 For 循环不需要以小括号包覆起来。

Go 语言亦有内置 gofmt 工具,能够自动整理代码多余的空白、变量名称对齐、并将对齐空白转换成 Tab。hKS快充网络

特色[编辑]

Go 语言的主要的功能在于令人简易使用的并行设计,这个方法叫做 Goroutine,通过 Goroutine 能够让你的程序以异步的方式运行,而不需要害怕一个函数导致程序阻塞,因此 Go 语言也非常地适合网络服务。让我们假设有个程序,里面有两个函数:hKS快充网络

func main() {
    // 假設 loop 是一個會重複執行十次的迴圈函式。
    // 迴圈執行完畢才會往下執行。
    loop()
	// 執行另一個迴圈。
	loop()
}

在这个时候我们可以通过 go 来让其中一个函数以并发的方式运行,如此一来就不需要等待该函数运行完后才能运行下一个函数。hKS快充网络

func main() {
    // 透過 `go`,我們可以把這個函式以並行執行,
    // 如此一來這個函式就不會主阻塞程式的執行。
    go loop()
	// 執行另一個迴圈。
	loop()
}

Goroutine 是类似线程的概念(但 Goroutine 并不是线程)。线程属于系统层面,通常来说创建一个新的线程会消耗较多的资源且管理不易。而 Goroutine 就像轻量级的线程,但我们称其为并发,一个 Go 程序可以运行超过数万个 Goroutine[6],并且这些性能都是原生级的,随时都能够关闭、结束。一个核心里面可以有多个 Goroutine,通过 GOMAXPROCS 参数你能够限制 Gorotuine 可以占用几个系统线程来避免失控。hKS快充网络

在内置的官方包中也不时能够看见 Goroutine 的应用,像是 net/http 中用来监听网络服务的函数实际上是创建一个不断运行循环的 Goroutine。hKS快充网络

编译器[编辑]

当前有两个 Go 语言的编译器的分支。官方编译器gc和gccgo。官方编译器在初期使用C写成,后用go重写从而实现自举[7]。Gccgo是一个使用标准GCC作为后端的Go编译器[8]hKS快充网络

官方编译器支持跨平台编译(但不支持CGO),允许将源码编译为可在目标系统、架构上执行的二进制文件。hKS快充网络

示例[编辑]

下面是用 Go 语言写成的 Hello World 程序。hKS快充网络

1 package main
2 
3 import "fmt"
4 
5 func main() {
6 	fmt.Println("Hello, World")
7 }

通过 Go 语言仅需几行程序码就完成 HTTP 网页服务器的实现:hKS快充网络

 1 package main
 2 
 3 import (
 4 	"io"
 5 	"net/http"
 6 )
 7 
 8 func hello(w http.ResponseWriter, r *http.Request) {
 9 	io.WriteString(w, "Hello world!")
10 }
11 
12 func main() {
13 	http.HandleFunc("/", hello)
14 	http.ListenAndServe(":8000", nil)
15 }

下面的例子说明了怎样用 Go 语言去实现一个像 Unix 中的 Echo命令程序[9]hKS快充网络

 1 package main
 2 
 3 import (
 4 	"os"
 5 	"flag"
 6 )
 7 
 8 var omitNewline = flag.Bool("n", false, "don't print final newline")
 9 
10 const (
11 	Space   = " "
12 	Newline = "\n"
13 )
14 
15 func main() {
16 	flag.Parse() // Scans the arg list and sets up flags
17 	var s string = ""
18 	for i := 0; i < flag.NArg(); i++ {
19 		if i > 0 {
20 			s += Space
21 		}
22 		s += flag.Arg(i)
23 	}
24 	if !*omitNewline {
25 		s += Newline
26 	}
27 	os.Stdout.WriteString(s)
28 }

同名争议[编辑]

2003年发表的编程语言 Go!,Go 名称与其雷同。hKS快充网络

来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
相关文章
    无相关信息
栏目更新
栏目热门