(一)Goroutines
Goroutines是Go运行时的轻量级线程管理,Goroutines运行在同样的地址空间,所以使用的共享内存必须是同步的
开始一个Go的并发的写法如下:
go f(x,y,z)
(二)Channels
Channels是一个可以发送和接受数据的管道,操作符号是 <-
, 日常操作如下:
ch <- v //发送v的值给ch
v := <-ch //初始化v且接受来自ch的值
如下所示:
package main
import (
"fmt"
)
func word1(s string, c chan string) {
res := "Hello : " + s
c <- res
}
func word2(s string, c chan string) {
res := "Hi : " + s
c <- res
}
func main() {
s := []string{"Galarxy", "Kok"}
c := make(chan string)
go word1(s[0], c)
go word2(s[1], c)
x, y := <-c, <-c
fmt.Println(x, y)
}
运行结果:
Hi : Kok Hello : Galarxy
(三)管道的范围与关闭
一个管道在没有任何值发送的时候需要指明一个 close 关键字用于关闭管道,一个管道接收第二个参数的时候可以判断该参数是否为空,如:
v, ok := <- ch
当ok为false的时候,表示该管道已经没有接收更多的值,且已经关闭
package main
import (
"fmt"
)
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}
func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c)
for i := range c {
fmt.Println(i)
}
}
运行结果:
0
1
1
2
3
5
8
13
21
34
提示:应该只选择管道发送者关闭通道,而不是接收者,发送一个已经关闭了的管道将会导致报错
(四)Select
select 语句使用与go并发过程的多操作中
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
close(c)
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c, quit)
}
运行结果:
0
1
1
2
3
5
8
13
21
34
quit
(五)Default Selection
当select语句中没有其他事件被选择时,default case 是默认选中的
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(100 * time.Millisecond)
boom := time.After(500 * time.Millisecond)
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Println("...")
time.Sleep(50 * time.Millisecond)
}
}
}
运行结果:
...
...
tick.
...
...
tick.
...
...
tick.
...
...
tick.
...
...
BOOM!
Golang的速成教程就先写到这里吧,是我高估了我自由可用时间的长度,目前已经大三了,才发现我所剩的自由不多了,我还有几个引擎没有开发完,之后都会很少写些什么东西了,以前我写博客是为了记住知识,但是我发现我最近总是在遗忘什么东西,有时候得到的学习资料更多的是英文的,翻译为中文会有语义上的冲突,思维也会微微的混乱,真的很佩服那些能写很多文章的人,那些作者花费了很多时间和精力去铸就一些具有价值性的见解,我的大脑总是在遗忘拥有和获得新知之间浑浑噩噩地思考着,旧有的依靠记录信息来给自己大脑制造印象的学习方式已经不适合目前的我,如果有时间,之后还是会回来写写记记些什么的,把更多的时间投入到别人没做,自己想做的事才是对我来说真正有意义的