#### 我了解带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)
}
```
更多评论
### 自问自答一波
```
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()
}
```
#1
### 自问自答二波
```
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()
}
```
#2