Go Academy
Go 语法与基础
75 分钟

A3: 并发基础

学习 goroutine、channel 和 select,理解 Go 并发模型与 JS 异步的差异

学习目标

  • 1.理解 goroutine 与线程、Promise 的区别
  • 2.掌握 channel 的创建、发送、接收操作
  • 3.学会使用 select 处理多 channel 场景

课程内容

本课时将帮助你快速掌握相关知识。以下是示例代码:

main.go
1package main
2
3import "fmt"
4
5func main() {
6 fmt.Println("Hello, Go!")
7
8 // Go 的变量声明
9 var name string = "TypeScript Developer"
10 age := 25 // 短变量声明
11
12 fmt.Printf("Name: %s, Age: %d\n", name, age)
13}

上面的代码演示了 Go 的基本语法,包括包声明、导入和变量声明。 注意第 8 行的短变量声明语法 :=,这是 Go 的特色。

与 TypeScript 对比

example.ts
// TypeScript 版本
const name: string = "TypeScript Developer";
const age = 25; // 类型推断
console.log(`Name: ${name}, Age: ${age}`);

实战练习

并发计算平方和

进阶

使用 goroutine 和 channel 并发计算 1-100 的平方和

初始代码

Go
1package main
2
3import "fmt"
4
5func main() {
6 // 创建一个 channel 用于收集结果
7 results := make(chan int)
8
9 // 启动 goroutine 计算每个数的平方
10 for i := 1; i <= 100; i++ {
11 go func(n int) {
12 // 请补全:将 n 的平方发送到 channel
13 }(i)
14 }
15
16 // 收集所有结果并求和
17 sum := 0
18 for i := 0; i < 100; i++ {
19 // 请补全:从 channel 接收结果并累加
20 }
21
22 fmt.Println("Sum of squares:", sum)
23}
查看参考答案
Go
1package main
2
3import "fmt"
4
5func main() {
6 results := make(chan int)
7
8 for i := 1; i <= 100; i++ {
9 go func(n int) {
10 results <- n * n
11 }(i)
12 }
13
14 sum := 0
15 for i := 0; i < 100; i++ {
16 sum += <-results
17 }
18
19 fmt.Println("Sum of squares:", sum)
20}