6.2 函数参数与返回值

Kesa...大约 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 返回此参数。

例: 06_2_side_effect.go

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