继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

使用channel实现goroutine

holdtom
关注TA
已关注
手记 1703
粉丝 240
获赞 991


PowerMichael关注0人评论13人阅读2018-12-24 22:27:42

使用channel实现goroutine

1.无缓冲channel

    package main

    import (

        "fmt"

        "time"

    )

    var message = make(chan string)

    //往channel中输入信息

    func sample1()  {

        message <- "hello gorotine."

    }

    //消费channel中的信息

    func sample2()  {

        str := <- message

        str = str + " run fast,run the world."

        message <- str

    }

    func main()  {

        go sample1()

        go sample2()

        time.Sleep(time.Second)

        fmt.Println(<-message)

        fmt.Println("message")

    }

2.buffer channel(缓冲channel)

    package main

    import (

        "fmt"

        "time"

    )

    /*

        1.buffer channel

        2.在函数中传递channel,而不是申明一个全局变量channel

        3.FIFO:first input first output

     */

    //往channel中输入信息

    func sample1(message chan string)  {

        message <- "hello gorotine.1"

        message <- "hello gorotine.2"

        message <- "hello gorotine.3"

        message <- "hello gorotine.4"

    }

    //消费channel中的信息

    func sample2(message chan  string)  {

        str := <- message

        str = str + " run fast,run the world."

        message <- str

    }

    func main()  {

        var message = make(chan string, 4)

        go sample1(message)

        go sample2(message)

        time.Sleep(time.Second)

        fmt.Println(<-message)

        fmt.Println(<-message)

        fmt.Println(<-message)

        //fmt.Println(<-message)

        fmt.Println("message")

    }

   // 2.1 output1

    hello gorotine.2

    hello gorotine.3

    hello gorotine.4

    message

取消这行代码的注释//fmt.Println(<-message),将会得到如下的输出,这正好说明了先进先出的概念

  //2.2 output2

    hello gorotine.2

    hello gorotine.3

    hello gorotine.4

    hello gorotine.1 run fast,run the world.

    message

3.遍历channel及关闭遍历channel

package main

import (

    "fmt"

    "time"

)

/*

    1.buffer channel

    2.在函数中传递channel,而不是申明一个全局变量channel

    3.FIFO:first input first output

 */

//往channel中输入信息

func sample1(message chan string)  {

    message <- "hello gorotine.1"

    message <- "hello gorotine.2"

    message <- "hello gorotine.3"

    message <- "hello gorotine.4"

}

//消费channel中的信息

func sample2(message chan  string)  {

    str := <- message

    str = str + " run fast,run the world."

    message <- str

}

func main()  {

    var message = make(chan string, 4)

    go sample1(message)

    go sample2(message)

    time.Sleep(time.Second)

    //使用range遍历channel

    for str := range message {

        fmt.Println(str)

    }

    fmt.Println("message")

}

不关闭channel,那么channel默认为空;那此时如果遍历,则会抛出异常

//3.1output1

hello gorotine.2

hello gorotine.3

hello gorotine.4

hello gorotine.1 run fast,run the world.

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:

main.main()

    D:/run/pms/src/test.go:37 +0x126

下面演示关闭channel的遍历

package main

import (

    "fmt"

    "time"

)

/*

    1.buffer channel

    2.在函数中传递channel,而不是申明一个全局变量channel

    3.FIFO:first input first output

 */

//往channel中输入信息

func sample1(message chan string)  {

    message <- "hello gorotine.1"

    message <- "hello gorotine.2"

    message <- "hello gorotine.3"

    message <- "hello gorotine.4"

}

//消费channel中的信息

func sample2(message chan  string)  {

    str := <- message

    str = str + " run fast,run the world."

    message <- str

    close(message)

}

func main()  {

    var message = make(chan string, 4)

    go sample1(message)

    go sample2(message)

    time.Sleep(time.Second)

    //使用range遍历channel

    for str := range message {

        fmt.Println(str)

    }

    fmt.Println("message")

}

//3.2output2

hello gorotine.2

hello gorotine.3

hello gorotine.4

hello gorotine.1 run fast,run the world.

message

©著作权归作者所有:来自51CTO博客作者PowerMichael的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP