go协程笔试题

求 y=(x+1)x2 两个协程分别算

var wg sync.WaitGroup

func F1(down chan int) {
	defer wg.Done()
	for i := range 5 {
		down <- (i + 1)
	}
	close(down)
}

func F2(up, down chan int) { //进行乘以2的操作
	defer wg.Done()
	for i := range up {
		down <- i * i
	}
	close(down)
}

func F3(up chan int) {
	defer wg.Done()
	for i := range up {
		fmt.Println(i)
	}
}

func main() {
	c0 := make(chan int)
	c1 := make(chan int)
	wg.Add(3)
	go F1(c0)
	go F2(c0, c1)
	go F3(c1)
	wg.Wait()
}

使用100个协程顺序打印 1 到 1000,并保证尾号为1的由协程1打印

先把功能实现了,这样就可以把结果都打印出来,并且满足要求

func main() {
	chans := make([]chan int, 100)
	var wg sync.WaitGroup
	for i := range 100 {
		chans[i] = make(chan int)
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			for n := range chans[id] {
				fmt.Printf("协程号%d, num:%d\n", id, n)
			}
		}(i)
	}
	for i := 0; i < 1000; i++ {
		id := i % 100
		chans[id] <- i
	}
	for i := range 100 {
		close(chans[i])
	}
	wg.Wait()
}

如果要求,必须从协程0 到99 的顺序打印呢?

func main() {
	chans := make([]chan int, 100)
	// 把这个信号量加上,就能控制打印顺序了
	ack := make(chan struct{})
	var wg sync.WaitGroup
	for i := range 100 {
		chans[i] = make(chan int)
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			for n := range chans[id] {
				fmt.Printf("协程号%d, num:%d\n", id, n)
				<-ack
			}
		}(i)
	}
	for i := 0; i < 1000; i++ {
		id := i % 100
		chans[id] <- i
		// 通知协程去读
		ack <- struct{}{}
	}
	for i := range 100 {
		close(chans[i])
	}
	wg.Wait()
}

三个协程,交替打印 abc 10次

为了防止,思路多了,记不下来,所有的操作,都是按照上一题的思路来写

func main() {
	chans := make([]chan struct{}, 3)
	ack := make(chan struct{})
	var wg sync.WaitGroup
	for i := range 3 {
		chans[i] = make(chan struct{})
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			for range chans[id] {
				fmt.Printf("chan:%d,%c\n", id, 'a'+id)
				<-ack
			}

		}(i)
	}
	for i := range 10 {
		// 切记,得放完以后,才能通知人家通道去读呀,这两行顺序不能错了
		chans[i%3] <- struct{}{}
		ack <- struct{}{}
	}
	for i := range 3 {
		close(chans[i])
	}
	wg.Wait()
}

2个协程,交替打印奇偶数

还是用上面那套算法,思路简单明了

func main() {
	chans := make([]chan int, 2)
	var wg sync.WaitGroup
	ack := make(chan struct{})
	for i := range 2 {
		chans[i] = make(chan int)
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			for n := range chans[id] {
				flag := "偶数"
				if id%2 == 0 {
					flag = "奇数"
				}
				fmt.Printf("chan:%d; %s %d\n", id, flag, n)
				<-ack
			}
		}(i)
	}
	for i := range 100 {
		chans[i%2] <- i
		ack <- struct{}{}
	}
	for i := range 2 {
		close(chans[i])
	}
	wg.Wait()
}

posted @ 2025-12-05 04:18  沧海一声笑rush  阅读(14)  评论(0)    收藏  举报