Go函数参数与返回值
Go函数支持多参数、多返回值,语法灵活。
参数传递
基本参数
Go
func greet(name string) {
fmt.Println("Hello, ", name)
}
greet("Tom") // 调用
多参数
Go
// 多个参数
func add(a, b int) int {
return a + b
}
// 相同类型合并
func print(a, b, c int) {
fmt.Println(a, b, c)
}
// 不同类型分开写
func info(name string, age int) {
fmt.Println(name, age)
}
参数传递方式
Go
// Go只有值传递
// 传递的是值的副本
func modify(n int) {
n = 100 // 修改副本
}
func main() {
x := 10
modify(x)
fmt.Println(x) // 10,不变
}
Go只有值传递,指针传递本质上也是传递指针值的副本。
指针参数
Go
// 使用指针可修改原值
func modify(n *int) {
*n = 100
}
func main() {
x := 10
modify(&x)
fmt.Println(x) // 100,已修改
}
返回值
单返回值
Go
func add(a, b int) int {
return a + b
}
result := add(1, 2)
多返回值
Go
// 返回多个值
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("除数不能为0")
}
return a / b, nil
}
// 接收多返回值
result, err := divide(10, 2)
if err != nil {
fmt.Println(err)
}
命名返回值
Go
// 命名返回值
func add(a, b int) (sum int) {
sum = a + b
return // 起名后可省略返回值名
}
// 等价于
func add(a, b int) (sum int) {
sum = a + b
return sum
}
命名返回值会在函数开头初始化为零值。
命名返回值示例
Go
func calculate(a, b int) (sum, diff int) {
sum = a + b
diff = a - b
return // 自动返回sum和diff
}
s, d := calculate(10, 5)
fmt.Println(s, d) // 15 5
可变参数
基本语法
Go
// 可变参数用...表示
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
// 调用
sum(1) // 1个参数
sum(1, 2, 3) // 多个参数
sum(1, 2, 3, 4, 5) // 任意数量
传递slice
Go
nums := []int{1, 2, 3, 4}
sum(nums...) // 展开slice传递
参数与返回值对比
| 类型 | 语法 | 示例 |
|---|---|---|
| 单参数 | func f(a int) | 基本参数 |
| 多参数 | func f(a, b int) | 类型合并 |
| 多类型参数 | func f(a int, b string) | 分开写 |
| 指针参数 | func f(a *int) | 可修改原值 |
| 单返回值 | func f() int | 返回一个值 |
| 多返回值 | func f() (int, error) | 返回多个值 |
| 命名返回值 | func f() (n int) | 可省略return |
| 可变参数 | func f(nums ...int) | 任意数量 |
init函数用法
初始化变量
Go
var config Config
func init() {
config = loadConfig()
}
func main() {
// config已初始化
run(config)
}
多个init
Go
// 同一文件可以有多个init
func init() {
fmt.Println("init 1")
}
func init() {
fmt.Println("init 2")
}
// 按声明顺序执行
要点总结
- Go只有值传递,传递副本
- 指针参数可修改原值
- 支持多返回值,常用(int, error)
- 命名返回值可省略return后写变量名
- 可变参数用...nums接收任意数量
- slice传递给可变参数用nums...展开
- init函数在main前自动执行
- 多个init按声明顺序执行
📝 发现内容有误?点击此处直接编辑