golang 基础(23)channel

作者: zidea | 来源:发表于2019-03-29 19:56 被阅读6次
golang_real.jpg

goroutine 也就是协程间通讯是通过 channel 来实现的,channel 将信息从一个 goroutine 传递到给另一个 gorout。


golang_channel.jpg
func main(){
    messages := make(chan string)

    go func(){messages <- "ping"}()

    msg := <- messages
    fmt.Println(msg)
}

这里大家可能会有些疑惑,不过我告诉大家其实 main 本身也是一个 goroutine 大家就明白这个例子了吧。定义 channel 很简单我们, make(chan 传递数据类型)

messages := make(chan int8)

    go func(){messages <- 30}()

当然也可以传递一些结构体作为传递信息的类型。

type Email struct{
    title string
    body string
}

func main(){
    messages := make(chan Email)
    aEmail := Email{
        title:"angular",
        body:"angular content",
    }
    go func(){messages <- aEmail
    }()

    msg := <- messages
    fmt.Println(msg.title)
}

channel 有两种类型

  • Unbuffered channel
  • buffered channel
    之前我们介绍实例中都使用的是 Unbuffered channel

在一个 unbuffered channel 上执行 send 操作会阻塞当前的 goroutine 直到另一个 goroutine 对

这个 channel 执行 receive 操作,此时发送的 value 通过 channel 进行传递,两个 goroutine 继续后续的执行。相反如果是 receive 操作先执行,则 receive 的 goroutine 阻塞直到有另一个 goroutine 对 channel 执行 send 操作。

func main(){
    messages := make(chan string, 2)

    messages <- "buffered"
    messages <- "channel"

    fmt.Println(<-messages)
    fmt.Println(<-messages)
}
Golang_cyan.png

相关文章

网友评论

    本文标题:golang 基础(23)channel

    本文链接:https://www.haomeiwen.com/subject/kollbqtx.html