3 回答

TA貢獻1795條經驗 獲得超7個贊
通道的make(chan int)
隱式大小為零(
大小為零的通道是無緩沖的。指定大小的通道 make(chan int, n) 被緩沖。
在這里,通道<-ok
或ok <-
將被阻塞,直到有人處理它(并發)。所以,ok := make(chan int)
改為ok := make(chan int,1)
package main
import "fmt"
func main() {
? ? ok := make(chan int, 1)
? ? ok <- 1
? ? x := <- ok
? ? fmt.Println(x)
}
或者同時處理它
package main
import "fmt"
func main() {
? ? ok := make(chan int)
? ? go func(){
? ? ? ?ok <- 1
? ? }()
? ? x := <- ok
? ? fmt.Println(x)
}

TA貢獻2011條經驗 獲得超2個贊
在這里你試圖寫入一個無緩沖的通道,因為沒有 go routines 試圖從通道讀取它會達到死鎖情況
這是你可以做的
package main
import (
? ? "fmt"
? ? "time"
)
func main() {
? ? ok := make(chan int)
? ? go func() {
? ? ? ? for x := range ok {
? ? ? ? ? ? fmt.Println(x)
? ? ? ? }
? ? }()
? ? ok <- 1
? ? ok <- 3
? ? ok <- 2
? ? ok <- 5
? ? ok <- 3
? ? ok <- 9
? ? time.Sleep(1)
}

TA貢獻1846條經驗 獲得超7個贊
除了使用調試器,我沒有想到任何其他方法。嘗試鉆研
> main.main() ./main.go:20 (PC: 0x4b68dc)
? ? 15: func main() {
? ? 16:?
? ? 17:? ? ?c := make(chan int,10)
? ? 18:? ? ?a:=1
? ? 19:? ? ?c<-a
=>? 20:? ? ?fmt.Println(<-c)
? ? 21:?
? ? 22:?
? ? 23: }
(dlv) p c
chan int {
? ? qcount: 1,
? ? dataqsiz: 10,
? ? buf: *[10]int [1,0,0,0,0,0,0,0,0,0],
? ? elemsize: 8,
? ? closed: 0,
? ? elemtype: *runtime._type {size: 8, ptrdata: 0, hash: 4149441018, tflag: tflagUncommon|tflagExtraStar|tflagNamed|tflagRegularMemory (15), align: 8, fieldAlign: 8, kind: 2, equal: runtime.memequal64, gcdata: *0, str: 847, ptrToThis: 26368},
? ? sendx: 1,
? ? recvx: 0,
? ? recvq: waitq<int> {
? ? ? ? first: *sudog<int> nil,
? ? ? ? last: *sudog<int> nil,},
? ? sendq: waitq<int> {
? ? ? ? first: *sudog<int> nil,
? ? ? ? last: *sudog<int> nil,},
? ? lock: runtime.mutex {
? ? ? ? lockRankStruct: runtime.lockRankStruct {},
? ? ? ? key: 0,},}
(dlv)?
- 3 回答
- 0 關注
- 193 瀏覽
添加回答
舉報