다른 채널의 작전에 영향을 미칠인가, 그것은 하나 개의 채널 작전은 채널 B를 보낸 후 채널 (C)가 지난 루틴 채널이 전송되지 않고, 전송 어떻게 든 경우, 채널의 기본 원리 방법을 알고 노력하고, 나는이 간단한 코드를 만들어
나는 2 채널, 채널 c는 4 분할로 채널 b를 분할합니다.
package main
import (
"fmt"
"strconv"
)
func runner(idx int, c chan []int, b chan []int) {
var temp []int
fmt.Println("runner " + strconv.Itoa(idx))
bucket := <-b
for k, v := range bucket {
if v != 0 {
temp = append(temp, v)
bucket[k] = 0
}
if len(temp) == 5 {
break
}
}
//Strange condition if channel c is sent after channel b is sent,
//somehow the last chan is not being sent
b <- bucket
c <- temp
//this is right if channel b is sent after channel c is sent
//c <- temp
//b <- bucket
}
func printer(c chan []int) {
for {
select {
case msg := <-c:
fmt.Println(msg)
//time.Sleep(time.Second * 1)
}
}
}
func main() {
c := make(chan []int, 5)
bucket := make(chan []int)
go runner(1, c, bucket)
go runner(2, c, bucket)
go runner(3, c, bucket)
go runner(4, c, bucket)
bucket <- []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
go printer(c)
var input string
fmt.Scanln(&input)
}
이 코드를 사용하여 실제로 명확하지 않은 것은 분명하지 않습니다. 무엇을 얻고 실제로 얻는 것이 있습니까? – zerkms
코드를 실행 했습니까? 러너 기능을 확인하십시오. 채널 C로 먼저 보내고 나서 b, u가 올바른 조건을 갖게되면, 이것이 내가 이해하지 못하는 것입니다. 누군가가이 채널 동작을 설명하기를 바랍니다. –
"올바른 조건을 갖게됩니다" --- 그것이 문제의 문제입니다 : 당신은 "옳은"것이 무엇인지, 그리고 "잘못된 것"이 무엇인지를 설명하지 않았습니다. 추신 : "c", "u", "b"및 기타 쇼트닝을 사용하지 마십시오. – zerkms