# 语法go接函数的作用是什么?
官方文档是英文的
# 语法格式
go func(){
}
1
2
3
2
3
go func(){...}() 的作用,是启动一个匿名的 Goroutine(轻量级线程),这是 Go 语言实现并发的核心语法。
# 语法理解
go func(){...}() 的语义可以拆解为三部分来理解
func(){...}:定义了一个匿名函数,即没有名字的函数。():是对匿名函数的调用。必须带上,否则函数不会被调用。go:这是触发并发的关键。它告诉 Go 运行时,启动一个新的 Goroutine(轻量级线程)来并发执行这个匿名函数。
# 匿名 Goroutine
package main
import (
"fmt"
"time"
)
func main() {
// 启动一个匿名函数作为 goroutine
go func() {
fmt.Println("你好,来自 Goroutine!")
}()
time.Sleep(100 * time.Millisecond) // 等待 goroutine 执行完成
fmt.Println("你好,来自主函数!")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在这个例子中,go func(){...}() 启动了一个新的 Goroutine,和主函数 main 同时运行。
如果没有 time.Sleep,程序可能在新的 Goroutine 执行前就退出了。time.Sleep 在这里只是简单演示,生产环境建议使用 WaitGroup 等方式。
# 带参数的匿名Goroutine
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
// 为每个任务启动一个匿名 goroutine
for i := 1; i <= 3; i++ {
wg.Add(1) // 等待组计数器加 1
go func(id int) {
defer wg.Done()
// 任务完成后计数器减 1
fmt.Printf("任务 %d 由 goroutine 完成\n", id)
}(i) // 将 i 作为参数传递
}
wg.Wait() // 等待所有 goroutine 执行完毕
fmt.Println("所有任务完成")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 并发顺序是不确定的:Goroutine 的执行顺序由 Go 运行时调度,每次运行都可能不同。
- 使用频道 (Channel) 来同步:Goroutine 间推荐通过 Channel 通信。比直接使用
sync.Mutex共享内存更能避免数据竞争和锁的复杂性。 - 记得传参:匿名函数内通常使用外部变量,Go 支持闭包(捕获外部变量)。但为避免在循环中因变量共享引发问题,强烈建议通过参数将外部变量的值传递给匿名函数。