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()
}
相关推荐
Hanniel3 分钟前
Python 元类(下):进阶与实战建议
开发语言·python
会编程的土豆7 分钟前
Go interface 底层的 itab 到底是什么
开发语言·后端·golang
candyTong8 分钟前
Claude Code 每次调用 API 时,上下文是怎么"拼"出来的?
javascript·后端·架构
java_cj8 分钟前
MySQL 执行原理深度剖析:查询成本计算与优化器内幕
数据库·后端·mysql
java_cj11 分钟前
数据库范式化设计与性能优化全攻略
数据库·后端·性能优化·架构·开源
千纸鹤の脉搏12 分钟前
多线程的初步了解---进程与线程
java·开发语言·学习·线程
秋田君33 分钟前
Qt 5.12.8 下载与安装教程(附网盘资源)
开发语言·qt
雪隐37 分钟前
AI股票小助手01-量化交易基础概念
人工智能·后端·python
故事和你9137 分钟前
洛谷-【动态规划2】线性状态动态规划4
开发语言·数据结构·c++·算法·动态规划·图论
alwaysrun38 分钟前
Rust之代数数据类型Enum
后端·rust·编程语言