技术开发 频道

为Ruby程序员精心准备的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循环中,给变量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()函数来获得一个分片。

  如果这样继续下去的话,文章就可能成为Go语言语法的的简明教程。而我更希望将时间花费在一些有意思的新特性上,而不是这样的一个语法介绍。基本语法可以参照Go语言的文档,那会介绍得更好。

  下面让我们看看goroutines吧。

  Goroutines

  写并发的代码已经很困难了,写并发访问网络的代码就更加困难了。问题在于传统的线程不能很好得伸缩,而且线程一旦运行起来,就会很难去控制。Go语言项目组着手解决这个问题,于是乎goroutine就诞生了。

  本质上, goroutines是个轻量级的并发机制,通过使用一种称为channels的构建来进行线程间交互。它们都非常易于使用:

package main

import
"fmt"

func wait() {
  
//wait around with a forever loop
  
for {
  }
}

func main() {
  go wait()
  fmt.Println(
"We didn't wait because it was called as a goroutine!")
}

  在上面的代码中,wait方法是一个死循环,但是我们通过go wait()的方式来调用,而非直接的通过wait()来调用。这是告诉Go我们希望以一个goroutine的方式来调用,同时异步运行。既然这个循环是在后台运行的,那样运行这个程序就不会因为死循环而阻塞。

0
相关文章