Go语言基础(5)续篇 | 青训营笔记

38 阅读2分钟

接着上回说,该写channel,goroutine了,纯小白记录

goroutine

  1. 说到goroutine,首先就是并发,并发牵扯到进程,进程包含线程,线程包含协程。一个程序至少一个进程,一个进程至少含有一个线程,我们运行一个应用,那操作系统就会起一个进程,进程包含主线程,又会有协程帮忙,然后就是并行并发,并行就是多线程在单核上运行,并行就是多线程在多和上运行。
  2. go的协程和主线程,一个主线程可以起多个协程(高并发嘛)。
  3. go协程的特点
  • 有独立的栈空间
  • 共享程序堆空间
  • 调度由用户控制
  • 协程是轻量级的线程
  1. 代码演示
func test(){
for i:=0i<=5;i++{
fmt.Println("test()hello")
time.Sleep(time.Second)
}
}
func main(){
go test() //开启go协程,回合主线程一起运行
fmt.Println("main()heelo")
time.Sleep(time.Second)
}
  1. 终端显示
  2. main()hello
  3. test()hello
  4. main()hello
  5. test()hello
  6. test()hello
  7. main()hello
  8. main()hello
  9. test()hello
  10. main()hello
  11. test()hello
  12. 输出效果显示说明,main主线程和test协程一起运行

channel

  1. channel本质是数据结构-队列,数据是先进先出,主要是为了同步,当资源需要共享时用channel就可以在goroutine之间确保同步交换数据
  2. channel 分为两种:无缓冲通道和有缓冲通道,区别在于他的创建
  3. 代码演示
channel0:=make(chan,int)//无缓冲通道,默认内存为1
channel1:=make(chan,int,10)//有缓冲通道,内存为10

  1. 传递时需要用到 <- ->操作符
func main(){
    var ch1 chan int
    ch1 =make(chan int,1)
    ch1<-10
    x:=<-ch1
    fmt.Println(x)
    close(ch1) //关闭管道
}

channel和goroutine简单结合使用

package main
import "fmt"
func f1(ch chan<-int){
for i:=0;i<100;i++{
ch<-i
}
close(ch)
}
func f2(ch1 <-chan int,ch2 <-chan int){
for{
num,ok:=<-ch1
if !ok{
break
}
ch2<-num*num
}
close(ch2)
}
func main(){
ch1:=make(chan int,100)
ch2:=make(chan int,200)
go f1
go f2
//从通道中去出数据,因为没有下标索引,不能用一般的for循环
for value:=range ch2{
fmt.Println(value)
}
}
  1. 终端输出
  2. 0
  3. 1
  4. 4
  5. 9
  6. 16
  7. 25
  8. 64 .... 这是一个goroutine从0-100生成数字发送到通道一,然后从通道一中取出,计算平方,输送到通道二,通过协程让它们一起运行。先这样以后学到深处再说