6.2 函数参数与返回值
...大约 2 分钟
6.2 函数参数与返回值
6.2.1 参数传递
指针也是变量类型,有自己的地址和值,通常指针的值指向一个变量的地址。所以,按引用传递也是按值传递。
- 按值传递 (call by value):调用函数时,实参会将其副本传递给函数的实参。对形参的修改不会影响到形参。
- 按引用传递 (call by reference):将实参的地址传给形参(指针类型),此时可以通过指针来对原参数进行修改。
- 传递指针(32位或64位)消耗一般小于副本
- 引用类型(slice, map, interface, channel) 默认使用引用传递(即使没有显式使用指针)
6.2.2 命名的返回值 named return variables
尽量使用命名返回值:会使代码更清晰、更简短,同时更加容易读懂
// 非命名返回值
func f(parameter_list) (type, type, type ...)
// 命名返回值
func f(parameter_list) (v1 type, v2 type, ...)
- 命名返回作为结果形参时会被初始化相应类型的零值
例:TODO: 06_2_multiple_return.go
func mutlipleReturn() {
num := 10
x2, x3 := getX2AndX3(num)
printValues(num, x2, x3)
x2, x3 = getX2AndX3_2(num)
printValues(num, x2, x3)
}
func printValues(n, v1, v2 int) {
fmt.Printf("num = %d, 2x num = %d, 3x num = %d\n", n, v1, v2)
}
func getX2AndX3(input int) (int, int) {
return 2 * input, 3 * input
}
func getX2AndX3_2(input int) (x2 int, x3 int) {
fmt.Printf("init value x2: %d, x3: %d\n", x2, x3)
x2 = 2 * input
x3 = 3 * input
// return x2, x3
return
}
num = 10, 2x num = 20, 3x num = 30
init value x2: 0, x3: 0
num = 10, 2x num = 20, 3x num = 30
即使函数使用了命名返回值,你依旧可以无视它而返回明确的值.
6.2.3 空白符 (blank indentifier)
_
可用于匹配不需要的值并将其丢弃。
_, x3 := getX2AndX3(num)
此处的第一个返回值被丢弃。
6.2.4 改变外部变量 (outside variable)
传递指针给函数不仅可以节省内存,也可以赋予函数直接修改外部变量的能力,那么就可不使用 return
返回此参数。
func sideEffect() {
a, b := 2, 3
var reply int
multiply(a, b, &reply)
fmt.Printf("%d * %d = %d\n", a, b, reply)
}
func multiply(a, b int, reply *int) {
*reply = a * b
}
2 * 3 = 6
Powered by Waline v2.15.2