zoukankan      html  css  js  c++  java
  • Understanding Chan Chan's in Go

    转自老外的文章:http://tleyden.github.io/blog/2013/11/23/understanding-chan-chans-in-go/

    A channel describes a transport of sorts. You can send a thing down that transport. When using a chan chan, the thing you want to send down the transport is another transport to send things back.

    They are useful when you want to get a response to something, and you don’t want to setup two channels (it’s generally considered bad practice to have data moving bidirectionally on a single channel)

    Visual time lapse walkthrough

    Keep in mind that Goroutine C is the “real consumer” even though it will be the one which writes to the request channel.

    The request channel starts out empty.

    Screenshot

    Goroutine C passes a “response channel” to go routine D via the request channel

    Screenshot

    Goroutine C starts reading from the (still empty) response channel.

    Screenshot

    Goroutine D writes a string to the response channel

    Screenshot

    Goroutine C now is able to read a value from response channel, and get’s the “wassup!” message

    Screenshot

    And now we are back to where we started

    Screenshot

    Here is some code that uses chan chan’s

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    package main
    
    import "fmt"
    import "time"
    
    func main() {
    
         // make the request chan chan that both go-routines will be given
         requestChan := make(chan chan string)
    
         // start the goroutines
         go goroutineC(requestChan)
         go goroutineD(requestChan)
    
         // sleep for a second to let the goroutines complete
         time.Sleep(time.Second)
    
    }
    
    func goroutineC(requestChan chan chan string) {
    
         // make a new response chan
         responseChan := make(chan string)
    
         // send the responseChan to goRoutineD
         requestChan <- responseChan
    
         // read the response
         response := <-responseChan
    
         fmt.Printf("Response: %v
    ", response)
    
    }
    
    func goroutineD(requestChan chan chan string) {
    
         // read the responseChan from the requestChan
         responseChan := <-requestChan
    
         // send a value down the responseChan
         responseChan <- "wassup!"
    
    }
    

    This code can be run on Go playground

  • 相关阅读:
    数据库连接JOIN
    Java面试金典
    Collections.sort详解
    Java复合优先于继承
    js算术运算符与数据类型转换
    js数组类型
    js对象类型
    CSS-API(CSS编程接口),CSSOM(css对象模型)
    从零开始--单片机十字路口交通灯控制实验
    matlab用双重循环实现费诺编码
  • 原文地址:https://www.cnblogs.com/wjx0912/p/6256049.html
Copyright © 2011-2022 走看看