引入
代码里有些逻辑反复出现,复制粘贴又难维护。函数把一段代码封装起来,需要时再调用,给个名字就能复用。Go 的函数支持多参数、多返回值,配合命名返回值和 _ 忽略值,写起来既灵活又干净。
正文
定义
定义
函数是一段可复用的代码块,接收输入(参数),执行后产出结果(返回值)。Go 用
func关键字声明函数,支持多参数和多返回值,参数和返回值都必须声明类型。
语法
// 基本函数声明
func 函数名(参数名 参数类型) 返回值类型 {
// 函数体
return 返回值
}
// 多参数
func add(a int, b int) int {
return a + b
}
// 参数类型相同可简写
func add(a, b int) int {
return a + b
}
// 多返回值
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("除数不能为 0")
}
return a / b, nil
}例子
无参无返回值
func sayHello() {
fmt.Println("Hello, Go!")
}
func main() {
sayHello()
}最简单的函数,不接受参数也不返回结果,纯粹执行一段逻辑。
带参数
func greet(name string) {
fmt.Println("Hello,", name)
}
func main() {
greet("Alice")
}调用函数时传进去的数据叫实参,函数定义里的叫形参。Go 的参数必须声明类型。
同类型参数简写
func add(a, b int) int {
return a + b
}相邻参数类型相同时,只在最后一个参数后面写类型,前面的省略。
多返回值
func swap(a, b string) (string, string) {
return b, a
}
func main() {
x, y := swap("hello", "world")
fmt.Println(x, y) // world hello
}函数执行后交回来的结果叫返回值,Go 支持多返回值,一次拿回多个结果。
命名返回值
func split(sum int) (x, y int) {
x = sum / 10
y = sum % 10
return
}返回值声明时可以起名字,函数体里直接给命名返回值赋值,return 不带参数也能返回。
用 _ 忽略返回值
func getUser() (string, int) {
return "Alice", 25
}
func main() {
name, _ := getUser()
fmt.Println(name)
}不需要的返回值用 _ 忽略,Go 要求返回值必须被接收或显式忽略。
空白标识符 _ 忽略中间值
result, _, err := doSomething()
if err != nil {
fmt.Println("出错了:", err)
}多返回值里只关心某几个值时,其余用 _ 丢掉。
常见写法
| 写法 | 说明 |
|---|---|
func f() | 无参无返回值 |
func f(a, b int) int | 同类型参数简写 |
func f() (int, error) | 多返回值 |
func f() (x, y int) | 命名返回值 |
x, _ := f() | 忽略某个返回值 |
func f(a int, b string) | 不同类型参数 |
特点
- Go 函数用
func声明,参数和返回值必须写类型 - 支持多返回值,常见模式是
(结果, error) - 参数类型相同时可以简写:
a, b int - 命名返回值可以省略
return后面的值,但不推荐在长函数里用 _用来忽略不需要的返回值,避免编译报错- Go 函数不支持默认参数和函数重载
- 参数传递是值传递,函数内修改参数不影响原始变量
理解
函数就是给一段代码起了个名字,想用的时候喊一声就行。Go 的函数最特别的地方是多返回值,配合 error 做错误处理非常自然。没有默认参数和函数重载一开始会觉得不方便,但习惯了反而觉得代码更清晰——每个调用都写得明明白白。
引出
基本函数搞清楚了,接下来看看函数更高级的用法——匿名函数、闭包、函数作为值传递。这些都是 Go 函数进阶 的内容。