Go|腾讯面经总结

文章目录

用goroutine交替输出abc和123

  • 使用两个无缓冲 channel 来实现 goroutine 之间的交替通知。
  • 一个 channel 控制字母 goroutine,另一个 channel 控制数字 goroutine。
  • 每个 goroutine 在输出前先阻塞等待自己的 channel,输出完成后再向另一个 channel 发送信号,把执行权交给对方。
  • 主 goroutine 先向字母 channel 发送一个初始信号,从而启动整个交替流程。
  • 由于无缓冲 channel 的发送和接收具有同步阻塞特性,所以可以保证两个 goroutine 严格按照 a1b2c3 的顺序输出。
go 复制代码
package main

import (
	"fmt"
	"sync"
)

func main() {
	letters := []rune("abc")
	numbers := []rune("123")

	letterCh := make(chan struct{})
	numberCh := make(chan struct{})

	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		defer wg.Done()

		for i, ch := range letters {
			<-letterCh
			fmt.Print(string(ch))

			if i < len(numbers) {
				numberCh <- struct{}{}
			}
		}
	}()

	go func() {
		defer wg.Done()

		for i, ch := range numbers {
			<-numberCh
			fmt.Print(string(ch))

			if i+1 < len(letters) {
				letterCh <- struct{}{}
			}
		}
	}()

	letterCh <- struct{}{}

	wg.Wait()
	fmt.Println()
}
相关推荐
MATLAB代码顾问1 小时前
差分进化算法(DE)原理与Python实现
开发语言·python·算法
步达硬件1 小时前
【MATLAB】生成视频code(用于显示器画质测试)
开发语言·matlab·音视频
曹牧1 小时前
Java:“Syntax error on token “do“, Identifier expected”
java·开发语言
geovindu1 小时前
go: Registry Pattern
开发语言·后端·设计模式·golang·注册模式
Le_ee1 小时前
ctfweb:flask+ssti
后端·python·flask
木易 士心1 小时前
一文彻底搞懂 Elasticsearch:原理、场景、避坑与优化
大数据·后端·elasticsearch·搜索引擎
xyq20241 小时前
Swift 类
开发语言
赏金术士1 小时前
Kotlin 从入门到进阶 之异常与标准库(八)
android·开发语言·kotlin
Brilliantwxx1 小时前
【C++】认识 list(初步认识+模拟实现)
开发语言·数据结构·c++·笔记·算法·list