贝利信息

如何在Golang中定义函数_Golang函数声明与参数返回规则

日期:2026-01-13 00:00 / 作者:P粉602998670
Go函数声明必须显式标注所有参数和返回类型,不支持类型推导;变参仅能有一个且须为最后一个;函数是一等公民,但闭包捕获变量引用而非值。

函数声明必须显式写出所有参数类型和返回类型

Go 不支持类型推导或默认参数,每个参数和返回值的类型都得写清楚,不能省略。比如 func add(a, b int) int 是合法的,但 func add(a, b) intfunc add(a, b int)(无返回类型)会直接报错 missing returnexpected type

命名返回值会让代码更清晰,但要小心“零值陷阱”

你可以给返回值起名字,比如 func divide(a, b float64) (result float64, err error)。这样函数体内可以直接对 resulterr 赋值,且在 return 语句不带参数时,会自动返回这些变量的当前值(即“裸返回”)。

变参函数只能有一个,且必须是最后一个参数

Go 用 ... 表示变参,例如 func sum(nums ...int) int。它本质是把参数转成一个切片,所以调用时可以传 sum(1, 2, 3),也可以传 sum(nums...)(注意末尾的 ... 展开语法)。

函数是一等公民,但闭包捕获的是变量引用而非快照

Go 支持把函数赋值给变量、作为参数传递、从函数返回,例如 var f func(int) int = func(x int) int { return x * 2 }。但要注意:循环中创建的闭包共享外部变量的引用。

for i := 0; i < 3; i++ {
    defer func() {
        fmt.Println(i) // 全部输出 3,不是 0/1/2
    }()
}

函数签名里每个位置的类型都不能含糊,命名返回值看着方便,实际调试时容易因零值掩盖逻辑遗漏;变参看着灵活,但展开和接收的写法稍有不慎就 panic;闭包看似简单,但在循环和 goroutine 里最容易掉进引用陷阱。