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