Go 函数使用 func 声明,一个显著的特点是多个返回值 — 函数可以一次返回多个值。这在整个语言中被广泛使用,尤其是在定义 Go 错误处理的 (result, error) 习语中。
基本函数
go
{
a + b
}
{
+ name
}
func divide(a, b int) (int, error) { // returns BOTH a result AND an error
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil // nil error = success
}
// callers handle both — the ubiquitous Go error pattern
result, err := divide(10, 2)
if err != nil {
log.Fatal(err) // handle the error
}
fmt.Println(result)
返回 (value, error) 是 Go 中处理错误的习语 — 函数将错误作为值返回,而不是抛出异常,调用方需要显式检查这些错误。这使错误处理可见且不可能被无声地忽视。
// many built-ins return (value, ok) — a boolean for "did it work?"
value, ok := myMap["key"] // ok = false if the key is missing
if ok { ... }
v, ok := someInterface.(string) // type assertion with ok
func split(sum int) (x, y int) { // named returns
x = sum * 4 / 9
y = sum - x
return // "naked return" — returns the named values
}
func sum(nums ...int) int { // accepts any number of ints
total := 0
for _, n := range nums {
total += n
}
return total
}
sum(1, 2, 3) // 6
sum(nums...) // spread a slice into args
var op func(int, int) int = add // assign functions to variables
func apply(fn func(int) int, x int) int { return fn(x) } // pass as arguments
Go 的函数是核心概念,多个返回值是该语言的定义特性之一 — 它们使 (result, error) 习语成为可能,这就是 Go 的错误处理方式(显式检查错误值,而不是异常)。
这种模式在几乎所有 Go 程序中使用,使错误处理变得可见且刻意为之。
相关的 comma-ok 习语(value, ok :=)在整个语言中都出现过(map 访问、类型断言、channel 接收)。
理解多个返回值、错误模式、命名返回值、可变参数函数和一等函数对于阅读和编写习语化的 Go 代码是必不可少的 — 而且错误值哲学是 Go 和基于异常的语言之间最重要的概念差异之一。