本身是想尝试一下,看看go语言中channel取出的顺序是不是随机的,我总共写了两个方式的使用,一个是直接在main函数里使用无命名函数,这种方式出错了,另一个是调用main函数外的函数,这种方式正确了。最终实验结果为从channel取出的顺序是随机的。
这是第一个版本的代码
package main
import (
"fmt"
"os"
)
func main() {
ch := make(chan string)
for _, item := range os.Args[1:] {
go func() {
ch <- fmt.Sprint(item)
}()
}
for range os.Args[1:] {
fmt.Println(<-ch)
}
}
该代码执行后只会输出最后一个元素,如执行./main 1 2 3 4
则输出
4
4
4
4
用i接收循环轮数,在func()内部加上输出循环轮数的fmt.Sprint(i),发现输出四次第四轮循环。这里不知道为啥,希望懂的大佬能讲讲。
这是第二个版本的代码
package main
import (
"fmt"
"os"
)
func main() {
ch := make(chan string)
for _, item := range os.Args[1:] {
go addstring(ch, item)
}
for range os.Args[1:] {
fmt.Println(<-ch)
}
}
func addstring(ch chan<- string, item string) {
ch <- fmt.Sprint(item)
}
两次执行 ./main 1 2 3 4
执行结果为
2
4
1
3
和
4
2
1
3