看着教材一路过来,我知道chan是和线程有关的东西,但是chan声明的时候只要加上大小,就可以用于同步传值,那不和切片差不多了吗? 真的有同步chan的必要吗 ? 以下代码是自己根据疑惑所编写的代码,结果是一样的, 求大神解答:
func main() {
s1 := []int{}
s2 := make(chan int, 5)
for i := 0; i < 5; i++ {
s1 = append(s1, i)
s2 <- i
}
close(s2)
for _, k := range s1 {
fmt.Println("print slices : ", k)
}
for k := range s2 {
fmt.Println("print channels : ", k)
}
}
首先第一点你要先明白,slice和chan并不是同样的东西。
slice是一个可变长度的数组,数组是一个容器,是用来存储数据用的。
chan是管道,管道并不是存储数据用的,管道是为了grounite之间通信用的。
chan分为缓存chan,和非缓存chan,你上面定义的是缓存chan所以表面上看起来你可以往里存数据而不会造成阻塞,
你如果定义一个非缓存chan你就会明白,如果往非缓存chan存数据而不立马取出就会立马阻塞。
#2
更多评论
两个完全不一样的东西,有一个表现类似,你不能就说它们是一样的。
就简单一个问题:chan 取走值后,可以继续往里面写,slice 可以吗?slice 是取走吗?
#1
你好,指的是这样吗 ?
func main() {
c := make(chan int)
go func() {
for i := 0; i < 3; i++ {
c <- i
}
}()
fmt.Println(<-c)
go func() {
for i := 0; i < 3; i++ {
c <- i
}
}()
}
算不算没有立马取出 ? 没有阻塞呀
#3