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()
}
相关推荐
gugucoding6 小时前
2. 【Java】搭建Java开发环境
java·开发语言
多加点辣也没关系6 小时前
JavaScript|第9章:对象 — 基础
开发语言·javascript·ecmascript
2601_949818096 小时前
Vector从入门到应用(C++ STL动态数组万字全解
开发语言·c++
汤米粥7 小时前
Python爬虫中Xpath用法之——normalize-space()
开发语言·python
IguoChan7 小时前
4. d2l — 模型选择、欠拟合和过拟合
后端
科技道人7 小时前
记录 设置-显示大小和字体
开发语言·android设置·字体和显示大小
浮江雾7 小时前
Flutter第三节----Dart中的数据类型
android·开发语言·学习·flutter·入门·函数
weixin_422329318 小时前
AgentScope Java 项目入门 & Builder 深度解读
java·开发语言·人工智能
shepherd1268 小时前
一次把 Spring MVC 文件上传参数“查没了”的排查:multipart、Filter 与 request body 的连环坑
java·后端·spring·mvc
chh5638 小时前
C++--list
开发语言·数据结构·c++·学习·算法·list