听了会歌 一看了下今天已经下午2:50了
我们学校也好像开始放学生们回家了
那今天最后就愉快愉快的把我们的 A Tour Of Go 最后一程给送走吧
并发
goroutine
大名鼎鼎的Go协程 原语言支持的协程
简单测试一下吧 这里也就是简单介绍
package main
import "fmt"
func TestGoroutine(str *string) {
fmt.Println(*str)
}
func main() {
str := "hello"
teststr := "say hello"
go TestGoroutine(&str)
TestGoroutine(&teststr)
}
运行效果
可以把其作为linux
中的共享信道 作为pipe用
其实我个人认为就是pipe 而pipe在linux
作为共享进程的通讯工具
这个就作为go中独有的channel 下面是简单应用
package main
import "fmt"
func TestGoroutine(str *string) {
fmt.Println(*str)
}
func Sum(slice []int, channel chan int) {
sum := 0
for _, num := range slice {
sum += num
}
channel <- sum
}
func main() {
slice := []int{1, 2, 3, 4, 5, 10, 12, 30}
ch1, ch2 := make(chan int), make(chan int)
go Sum(slice[:len(slice) / 2], ch1)
go Sum(slice[len(slice) / 2:], ch2)
sum1, sum2 := <-ch1, <-ch2
fmt.Println(sum1, sum2, sum1 + sum2)
}
设置大小的信道 一旦信道的空间被塞满了 一旦继续塞了之后则直接会被阻塞
创建出信道的格式是make(chan type, space int)
例如下面 所有的协程则将休眠
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
ch <- 3
fmt.Println(<-ch)
fmt.Println(<-ch)
}
range
和close
信道
close
信道的时候 如果对方不听的进入range
状态 则可以直接断开
range
则是一直获取
下面是简单的例子 就用示例代码吧
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)
}
}
运行效果
select语句类似于IO多路复用了 只不过在这里和IO多路复用原理感觉是差不多的 但不多揣测
下面用示例代码当例子
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:
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)
}
运行效果
剩下的就是并发了 这个就交给项目中实际操作来熟悉了
今天主要花时间去填写资料了 剩下的就不说了
go的新手村先走在这里吧