# 语法go接函数的作用是什么?

官方文档是英文的

# 语法格式

go func(){

}
1
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

在这个例子中,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
  • 并发顺序是不确定的:Goroutine 的执行顺序由 Go 运行时调度,每次运行都可能不同。
  • 使用频道 (Channel) 来同步:Goroutine 间推荐通过 Channel 通信。比直接使用 sync.Mutex 共享内存更能避免数据竞争和锁的复杂性。
  • 记得传参:匿名函数内通常使用外部变量,Go 支持闭包(捕获外部变量)。但为避免在循环中因变量共享引发问题,强烈建议通过参数将外部变量的传递给匿名函数
Last Updated: 6/3/2026, 4:53:54 AM