这是一道15年的面试题,我在博客园看到,作者用C实现了其功能,我最近不是在学go呢么,所以就用go实现了,程序实现比作者的C简单太多了,一目了然。(如果要看C的实现,可以点击链接http://blog.csdn.net/chencheng126/article/details/44488603 查看)
里边唯一一条评论是我填上去的,所以不要怪异为毛一模一样,O(∩_∩)O哈哈~
Paste_Image.png过完年了,俺终于从鸡鸭鱼肉的时间回来了。开始做面试题,准备实战了。
刚看到题目的时候,基本没什么考虑就有了下面的程序,思路:
1.有三个函数,分别负责打印A,B,C
2.利用Goroutine的特点,分别调用这三个函数,并将打印的值输出
package main
import (
"fmt"
"time"
)
func printA(c chan string) {
c <- "A"
}
func printB(c chan string) {
c <- "B"
}
func printC(c chan string) {
c <- "C"
}
func main() {
c := make(chan string, 3)
go printA(c)
go printB(c)
go printC(c)
cA := <-c
cB := <-c
cC := <-c
var i int
for i = 0; i < 10; i++ {
fmt.Print(cA)
time.Sleep(1 * time.Second)
fmt.Print(cB)
time.Sleep(1 * time.Second)
fmt.Print(cC)
time.Sleep(1 * time.Second)
}
}
执行结果:
ABCABCABCABCABCABCABCABCABCABC
睡了一夜,觉得这三个函数的功能其实就是打印,既然功能相同,为什么要三个函数来执行了,所以就改成了下面这段
package main
import (
"fmt"
"time"
)
func threadprint(details string, c chan string) {
c <- details
}
func main() {
c := make(chan string, 3)
go threadprint("A", c)
go threadprint("B", c)
go threadprint("C", c)
cA := <-c
cB := <-c
cC := <-c
var i int
for i = 0; i < 10; i++ {
fmt.Print(cA)
time.Sleep(1 * time.Second)
fmt.Print(cB)
time.Sleep(1 * time.Second)
fmt.Print(cC)
time.Sleep(1 * time.Second)
}
}
删除了其他两个功能一样的函数,还是用Goroutine的思路。
网友评论