1、函数的定义
func 函数名(参数列表) (返回值列表) {
// 函数体
}
- 1.1 参数类型简写:当多个相邻参数类型相同的时候,可以省略前面参数的类型,在最后一个参数后面加上类型即可,例如下面的两个函数是等价的
func add(a int, b int) int
func add(a,b int) int
- 1.2 可变参数:函数可以接受数量可变的参数,在参数类型前面加上“...”表示,例如
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
sumResult := sum(1, 2, 3, 4, 5)
fmt.Println("Sum:", sumResult)
//输出
//Sum: 15
2、多返回值函数
Go语言支持返回多个值,这是Go语言的特色
func change(a,b int) (int,int){
return b,a
}
//返回值可命名,
//可以在函数体内直接使用,
//return语句可以省略返回值
func change2(a,b int) (c int,d int){
c = b
d= a
return
}
Go语言鼓励显示的错误处理。标准做法是让函数返回一个结果和一个错误值(error类型)。如果函数执行成功错误值为nil,否则,错误值包含具体的错误信息。调用此类函数后,必须立即检查错误,这是一种良好的编程习惯。通常用 if err != nil 来判断。例如
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
// 返回错误
return 0, errors.New("除数不能为0")
}
// 成功则错误为nil
return a / b, nil
}
func main() {
//调用divide函数
result, err := divide(10, 0)
if err != nil {
// 输出错误信息
fmt.Println("错误:", err)
} else {
// 输出结果
fmt.Println("结果:", result)
}
}
//输出
//错误: 除数不能为0
3、匿名函数
匿名函数没有名字,可以定义后立即执行,或者赋值给一个变量
package main
import (
"fmt"
)
func main() {
//定义后立即执行
result := func(a, b int) int {
return a + b
}(3, 5)
fmt.Println("Result of anonymous function:", result)
//将匿名函数赋值给变量
sum := func(a, b int) int {
return a + b
}
fmt.Println("Sum using variable function:", sum(10, 20))
}
//输出
//Result of anonymous function: 8
//Sum using variable function: 30
4、闭包
闭包是一个函数值,它引用了其函数体之外的变量。这个函数可以访问并赋予其引用的变量的值,换句话说,这个函数被“绑定”在了这些变量上。闭包的一个典型应用是创建状态保存器。
package main
import "fmt"
// newCounter 返回一个闭包函数
func newCounter() func() int {
// 闭包外部的变量
count := 0
// 返回的匿名函数就是一个闭包
return func() int {
// 闭包内部可以修改外部的count变量
count++
return count
}
}
func main() {
// 创建一个计数器实例
counter := newCounter()
fmt.Println(counter())
fmt.Println(counter())
fmt.Println(counter())
// 创建另一个独立的计数器
anotherCounter := newCounter()
fmt.Println(anotherCounter())
}
//输出
//1
//2
//3
//1
函数可以定义,但人生不能定义,只要保持一颗勇敢的心,就能一直发光