记录 Go 语言常见的编程面试题。
func main() {
// 创建 3 个通道,A、B 和 Exit
A := make(chan bool)
B := make(chan bool)
Exit := make(chan bool)
go func() {
// 如果 A 通道是 true,则执行
for i := 1; i <= 10; i += 2 {
if ok := <-A; ok {
fmt.Println("A 输出", i)
B <- true
}
}
}()
go func() {
// 这个协程的活干完之后,向主 goroutine 发送信号
defer func() { Exit <- true }()
// 如果 B 通道是 true,则执行
for i := 2; i <= 10; i += 2 {
if ok := <-B; ok {
fmt.Println("B 输出", i)
// 如果 i 等于 10 了,就不要再向 A 通道写数据了,否则将导致 A 通道死锁
if i != 10 {
A <- true
}
}
}
}()
A <- true // 启动条件
<-Exit // 结束条件
}
func main() {
controlGoroutineNum(100)
}
var wg = sync.WaitGroup{}
// 控制 Goroutine 数量
func controlGoroutineNum(taskCount int) {
// 模拟用户需求的业务数量
ch := make(chan bool, 3)
for i := 0; i < taskCount; i++ {
wg.Add(1)
// 如果通道满了,就会阻塞
ch <- true
// 开启一个新协程
go bizMethod(ch, i)
}
wg.Wait()
}
// 业务方法
func bizMethod(ch chan bool, i int) {
fmt.Println("go func", i, " goroutine count = ", runtime.NumGoroutine())
<-ch
wg.Done()
}