这个hello,world怎么写 channel

yaxiaomu · 2020-06-28 19:10:35 · 2503 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-06-28 19:10:35 的主题,其中的信息可能已经有所发展或是发生改变。

我了解带buffer的channel,当在send的时候发现数据已满会阻塞,然后让出当前协程。

我现在想输出 hello world1 hello world2 各位客官有什么好方法没。

func main() {

        // buffered channel
    var c = make(chan string, 1)
    var sth string
    go func() {
        sth = "hello\n"
        fmt.Println(<-c)
    }()

    // 以下未通过,求教各位大佬
    c <- "world1"
    c <- "world2"
    //for {
    //    select {
    //    case <-c:
    //        fmt.Printf(sth)
    //    }
    //}
    fmt.Printf(sth)
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2503 次点击  
加入收藏 微博
12 回复  |  直到 2020-07-02 10:11:21
yaxiaomu
yaxiaomu · #1 · 5年之前

自问自答一波

package main

import (
    "fmt"
    "sync"
)

func main() {

    var (
        c   chan string
        sth string
        sy  chan bool
        wg  sync.WaitGroup
    )
    c = make(chan string)
    sy = make(chan bool)

    wg.Add(2)
    go func() {
        sth = "hello\n"
        // 到这里sth已经赋值,需要阻塞从c中取数据,因为需要先赋值后打印打印sth【hello】,
        sy <- true
        //sy通道消息被接收后,然后像c通道写入,然后这里打印world
        fmt.Println(<-c)
        wg.Done()
    }()

    go func() {
        <-sy
        //赋值sth后 hello后打印h然后把world写入到c channel
        fmt.Printf(sth)
        c <- "world"
        wg.Done()

    }()
    wg.Wait()
}
yaxiaomu
yaxiaomu · #2 · 5年之前

自问自答二波

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {

    c := make(chan string)
    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        c <- "world"
        defer wg.Done()
    }()

    go func() {
        defer wg.Done()

        time.Sleep(1 * time.Second)

        fmt.Println("hello " + <-c)
    }()
    wg.Wait()
}
hechu717
hechu717 · #3 · 5年之前

坐次沙发,哈哈!

hechu717
hechu717 · #4 · 5年之前

Golang我还不会用

zhengkeyu
zhengkeyu · #5 · 5年之前

go中文网也太不活跃了吧

polaris
polaris · #6 · 5年之前

哎,国内都喜欢微信群、qq群问~

yuantiancai
yuantiancai · #7 · 5年之前
zhengkeyuzhengkeyu #5 回复

go中文网也太不活跃了吧

部分原因是每次打开就能看到为什么当不了架构师那个,还有很多这种

jiongge
jiongge · #8 · 5年之前
package main
import (
"fmt"
"time"
)

func main() {

// buffered channel
var c = make(chan string, 1)
go func() {
    c <- "hello world1"
    c <- "hello world2"
    close(c)
}()

// 以下未通过,求教各位大佬

//or
//for sth:=range c{
//    fmt.Println(sth)
//}
for {
    select {
    case sth,ok:=<-c:
        if !ok{
            return
        }
        fmt.Println(sth)
    }
}
}
j2thinker
j2thinker · #9 · 5年之前

time包 没用

zhengkeyu
zhengkeyu · #10 · 5年之前
yuantiancaiyuantiancai #7 回复

#5楼 @zhengkeyu 部分原因是每次打开就能看到为什么当不了架构师那个,还有很多这种

这不是主要原因吧

422720735
422720735 · #11 · 5年之前

233

yuantiancai
yuantiancai · #12 · 5年之前
zhengkeyuzhengkeyu #10 回复

#7楼 @yuantiancai 这不是主要原因吧

你说呢

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传