为 Ruby 程序员准备的 Go 入门教程

那些在Google的大牛们开发出了一种称为Go的牛叉的语言。乍一看,Ruby和Go有点像远房表亲。其实不然,他们那些互为补充的功能却让他们成为一对完美组合。

Ruby程序员花时间了解一下Go还是非常有好处的,因为Go语言中一些创新之举还是很有不错的。

对于我来说,Go弥补了C++和Ruby之间空缺的联系。特别是当需要实现高响应的服务器的时候,我通常会选择C++,但是这样我就丢失了Ruby的精细之处。虽然我比较偏爱Ruby,可是即便是最近,当需要性能有明显提高的时,Ruby还是应付不来。

Go弥补了这个空缺。它提供像Ruby和Python这样动态语言的感觉的同时,也提供了编译语言的性能。

Go同时有一些与众不同的特性,本文会详细介绍。好了,让我们好好瞧瞧吧。

Go好在哪?

当写一个服务器的时候,一种实现并发的方式是为每个客户端开一个线程(你可能会觉得是在扯淡,好吧!没关系,继续读下去),特别是有许多客户端的时候,这种方式是非常糟糕的。较为好的解决方法是选择非阻塞IO(大家肯定表示赞同吧)。可是,即便都是Unix系的操作系统(诸如Linux,Mac OS X等等),有效地处理非阻塞IO的机制也是各不相同。此外,除了这些纷繁混杂,还有个C语言。我绝不反对嵌入式设备使用C语言,因为那绝对是速度第一,开发时间第二的。但是,作为一门日常语言,C已经不能满足我的需求了。

Go提供了令人惊讶的并发基元(primitives),良好的语法,优秀的函数库和快速的编译器。它解决我在使用C(某种程度上C++也是)遇到的问题。即使是基础代码变得很大的时候,使用Go语言依然很轻松。

在这篇文章中,我会依据文档,快速的回顾一下Go语言的基础特性。我们的重点在于突出那些让Go语言与众不同的创新之举。

无聊的基础介绍

Go语言是很容易上手,在基本语法这方面没玩什么新花样。下面是些基本代码:

package main
 
func main() {
 
}

我们从main函数开始。好了,试着输出个“Hello,world”吧!

package main
 
import "fmt"
 
func main() {
  fmt.Println("Hello, world!")
}

Go语言中输入输出模块被称作“fmt”,不像Ruby,这个“fmt”是默认不被包含的。所以需要在文件开始处用“import”声明引入。“fmt”模块中的Println函数会将你传入的字符串加上一个换行符一起输出(类似ruby的puts函数)。注意Go语言中公共方法是以大写字母开头的

下面看一下简单的循环:

package main
 
import "fmt"
 
func main() {
  //the basic for loop
  for i:=1; i < 100; i++ {
    fmt.Println(i)
  }
}

对于for循环,Go语言和Ruby完全不同。Go语言的for循环或多或少有点像C语言。你需要先定义个变量,然后检查状态,最后说明在迭代一次结束后需要做什么事(这个例子是i递增)。Go语言中的基本循环语法只有这一种。幸运的是,这个for循环非常灵活。比如说,下面这个死循环:

for {
}

我希望你能查看一些有个for的文档[#for].

请注意在我们的上面的for循环中,给变量i赋值的时候,我们没有用“=”,而是使用了“:=”。这儿有个说明差异的例子:

package main
 
import "fmt"
 
func main() {
  //defines the variable a
  a := 5
  fmt.Println(a)
 
  //sets a different value to a
  a = 10
  fmt.Println(a)
 
  //another way to define a variable
  var b int
  b = 15
  fmt.Println(b)
}

在main函数的开始,在声明变量a的同时进行了初始化,所以使用“:="。接下来的是简单的赋值,所以使用“=”。之所以这样,是因为实际上Go语言是静态类型语言,不像Ruby这样的动态类型。因此编译器必须得知道这个变量在哪声明和在哪赋值的。最后一部分代码比较清楚,就是简单地使用var关键字声明变量,然后进行赋值。

最后,作为和Ruby中数组的一个相似点,在Go语言中的数组也有分片。下面的代码中有个[]type的类型,这个type意思是着你希望分片返回的类型。但是这样的做法有点变扭 :

package main
 
func main {
  ///this creates a slice of integers with length 15
  mySlice := make([]int, 15)
}

我们需要make()函数来获得一个分片。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/73b419566f948c5df0024576b366fb36.html