初识golang语言,开始golang语言学习

Go(又称Golang{Google-go-language})是Google开发的一种静态强类型编译型并发型,并具有垃圾回收功能编程语言

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

目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。

1.描述

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

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

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

2.撰写风格

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

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

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

2.1项目架构[编辑]

Go的工作区的目录结构如下[6]

src
pkg
bin

三个目录的用途分别为

目录用途
src引用的外部
pkg编译时,生成的对象文件
bin编译后的程序

举例来说,整个项目目录可能会如下:

bin/
    hello                          # 生成的执行档
    outyet                         # 生成的执行档

pkg/
    linux_amd64/
        github.com/golang/example/
            stringutil.a           # 编译时,生成的对象档案
src/
    github.com/golang/example/
        .git/                      # 外部 Git 库的诠释资料
        hello/
            hello.go               # Git 库的程式码
        outyet/
            main.go                # Git 库的程式码
            main_test.go           # Git 库的程式码(测试用的程式)
        stringutil/
            reverse.go             # Git 库的程式码
            reverse_test.go        # Git 库的程式码(测试用的程式)
    golang.org/x/image/
        .git/                      # 外部 Git 库的诠释资料
        bmp/
            reader.go              # Git 库的程式码
            writer.go              # Git 库的程式码

3.特色[编辑]

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

func main() {
    // 假设 loop 是一位会重复执行十次的回圈函数。
    // 回圈執行完毕才會往下执行。
    loop()
	// 執行另一個回圈。
	loop()
}

这个时候通过Go让其中一个函数同步运行,如此就不需要等待该函数运行完后才能运行下一个函数。

func main() {
    // 透过 `go`,我们可以把这个函式同步执行,
    // 如此一来这个函式就不会阻塞主程式的执行。
    go loop()
	// 执行另一个回圈。
	loop()
}

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

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

4.编译器[编辑]

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

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

5.示例[编辑]

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

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

通过Go仅需几行程序码就完成HTTP网页服务器的实现:

 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命令程序[10]

 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 }

同名争议[编辑]

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值