在前面的例子中,我们讲过 for 和 range为基本的数据结构提供了迭代的功能.我们也可以使用这个语法来遍历从通道中取得的值 Example: package main import "fmt" //这个例子也让我们看到,一个非空的通道也是可以关闭的 //但是通道中剩下的值仍然可以被接收到. func main() { jobs := make(chan string, 2) jobs <- "one" jobs <- "two"…
我们可以使用通道来同步 Go 协程间的执行状态.这里是一个使用阻塞的接受方式来等待一个 Go 协程的运行结束. Example: package main import "fmt" import "time" //这是一个我们将要在 Go 协程中运行的函数.done 通道将被用于通知其他 Go 协程这个函数已经工作完毕. func worker(done chan bool){ fmt.Println("Working......") time.…
range 迭代各种各样的数据结构.让我们来看看如何在我们已经学过的数据结构上使用 rang 吧. package main import "fmt" func main() { 这里我们使用 range 来统计一个 slice 的元素个数.数组也可以采用这种方法. nums := []int{2, 3, 4} sum := 0 for _, num := range nums { sum += num } fmt.Println("sum:", sum) rang…
关闭 一个通道意味着不能再向这个通道发送值了.这个特性可以用来给这个通道的接收方传达工作已经完成的信息. Example: package main import "fmt" //在这个例子中,我们将使用一个 jobs 通道来传递 main() 中 Go协程任务执行的结束信息 //到一个工作 Go 协程中.当我们没有多余的任务给这个工作 Go 协程时 //我们将 close 这个 jobs 通道. func main() { jobs := make(chan int, 5) done…
在前面的例子中,我们用互斥锁进行了明确的锁定来让共享的state 跨多个 Go 协程同步访问.另一个选择是使用内置的 Go协程和通道的的同步特性来达到同样的效果.这个基于通道的方法和 Go 通过通信以及 每个 Go 协程间通过通讯来共享内存,确保每块数据有单独的 Go 协程所有的思路是一致的. Example: package main import ( "fmt" "math/rand" "sync/atomic" "time&quo…
Go 内建多返回值 支持.这个特性在 Go 语言中经常被用到,例如用来同时返回一个函数的结果和错误信息. Example: package main import "fmt" //(int, int)标志函数有两个int返回值. func example_func(a int, b int) (int, int){ return a, b } func main(){ c, d := example_func(1, 3) //fmt.Printf用来格式化字符串. fmt.Printf…
Example: package main import "fmt" func main() { fmt.Println("hello world") } Result: $ go run hello-world.go hello world 有时候我们想将我们的程序编译成二进制文件.我们可以通过 go build 命来达到目的. $ go build hello-world.go $ ls hello-world hello-world.go 然后我们可以直接运行…
在 Go 中,变量 被显式声明,并被编译器所用来检查函数调用时的类型正确性 package main import "fmt" func main() { var 声明 1 个或者多个变量. var a string = "initial" fmt.Println(a) 你可以申明一次性声明多个变量. var b, c int = 1, 2 fmt.Println(b, c) Go 将自动推断已经初始化的变量类型. var d = true fmt.Println(…
for 是 Go 中唯一的循环结构.这里有 for 循环的三个基本使用方式. package main import "fmt" func main() { 最常用的方式,带单个循环条件. i := 1 for i <= 3 { fmt.Println(i) i = i + 1 } 经典的初始化/条件/后续形式 for 循环. for j := 7; j <= 9; j++ { fmt.Println(j) } 不带条件的 for 循环将一直执行,直到在循环体内使用了 br…