package main
import (
"fmt"
"sync"
"time"
)
var waiter sync.WaitGroup
func print5(i int) {
j := i
for j < i+5 {
fmt.Println(j)
j++
}
waiter.Done()
}
func main() {
fmt.Println("Start print 75")
waiter = sync.WaitGroup{}
waiter.Add(15)
for i := 1; i < 75; i += 5 {
go print5(i)
time.Sleep(1 * time.Nanosecond)
}
waiter.Wait()
fmt.Println("End print 75")
}
程序输出如下,

image.png
有疑问加站长微信联系(非本文作者)

输出结果不稳定,也就是说结果不对
没有明白意思,是要控制goroutine输出顺序吗?
意思是通过携程输出1-75,要求结果顺序连续。
最后一种我试了不行,前面几种我试了都不行,我重新写的:
// 1、多线程顺序输出 1~75 var wg sync.WaitGroup
func print5(i int) { j := i for j < i+5 { time.Sleep(1 * time.Second) // 这个是为了缓慢输出 fmt.Println(j) j++ } wg.Done() }
func print75() { fmt.Println("Start Print 1~75 !") wg = sync.WaitGroup{} wg.Add(15) for i := 1; i < 75; i += 5 { time.Sleep(8 * time.Second) // 这个是为了缓慢输出 go print5(i) } wg.Wait() fmt.Println("End Print 1~75 !") }
var cv = make(chan int)
func print5_1() { fmt.Println(<-cv) time.Sleep(1 * time.Second) wg.Done() }
func print75_1() { wg.Add(75) for i := 1; i <= 75; i++ { time.Sleep(2 * time.Second) go print5_1() cv <- i } wg.Wait() }
这道题感觉就是傻逼题目,go 协程 刻意就是没有顺序的,在怎么控制,效率都没高多少,用加锁的形式输出,还不如主线程速度快,控制顺序 逃不了 要抢锁别无他法
估计就是考验面试者,对goroutine和channel理解,和使用程度
给他上个链表
这题目是考察任务编排吧
你看下面这代码,满足了题目中的要求,也做到了简单易懂。可是还是对题目用意一脸懵逼