这道题可以作为笔试题,现在给定下面一个条件
go func() {
for i := 1; i < 10; i++ {
println(2*i - 1)
}
}()
go func() {
for i := 1; i < 10; i++ {
println(2 * i)
}
}()
让你使用多种方式将奇偶合并,并打印自然数,这道题目很简单,思考几秒钟,看看你的实现。。。。。。好了我的实现比较low,没办法,golang 的代码怎么写都那个怂样。。。
1.第一种方式
package main
import (
"fmt"
"time"
)
var count = 15
func ping(c chan<- int) {
for i := 1; i < count; i++ {
c <- 2*i - 1
}
}
func pong(c chan<- int) {
for i := 1; i < count; i++ {
c <- 2 * i
}
}
func print(ch <-chan int) {
for {
msg := <-ch
fmt.Println(msg)
time.Sleep(time.Millisecond * 50)
}
}
func main() {
ch := make(chan int)
go ping(ch)
go pong(ch)
go print(ch)
var input string
fmt.Scanln(&input)
}
上面的代码,如果将
go print(ch) 改成下面这样 channel不使用传参的形式而是直接使用全局的变量可以吗?
for {
msg := <-ch
fmt.Println(msg)
time.Sleep(time.Millisecond * 50)
}
如果不行的话那是为什么?
2.第二种方式
package main
import (
"fmt"
"runtime"
// "time"
)
var count = 15
func main() {
runtime.GOMAXPROCS(1)
go func() {
for i := 1; i < count; i++ {
fmt.Println(2 * i)
runtime.Gosched()
}
}()
go func() {
for i := 1; i < count; i++ {
fmt.Println(2*i - 1)
runtime.Gosched()
}
}()
var input string
fmt.Scanln(&input)
}
第二种方式,在main函数中启用两个Goroutinue 思考一下,交换了他们的代码位置可不可以,为什么那?比如这样:
go func() {
for i := 1; i < count; i++ {
fmt.Println(2*i - 1)
runtime.Gosched()
}
}()
go func() {
for i := 1; i < count; i++ {
fmt.Println(2 * i)
runtime.Gosched()
}
}()
这两种方式其实都是我强行举的一个栗子,可能不太现实,但是如果了解golang内部结构的话,以上问题都不攻自破,接下来细节我会在日后的文章中将上面代码作为例子来讲解channel数据结构。
有疑问加站长微信联系(非本文作者)