go函数参数和返回值

go中函数参数和PHP中类似,区别是go中的函数参数必须是指定类型的(这是必须的).

go的函数体中如果有return关键字返回,那么此函数必须以returnpanic结尾

按值传递和按引用传递

Go中默认是按值传递,和PHP中类似.引用传递也和PHP类似,变量前加上&

比如funA(&arg),此时传递的是一个指针,当传递指针时,这个指针的值(变量指向的地址)会被复制,但指针的值所指向的地址上的值不会被复制.其实本质上,指针传递也是按值传递,只不过此时传递的是指针的值.

传递指针给函数不但可以节省内存(因为没有复制变量的值),而且赋予了函数直接修改外部变量的能力,所以被修改的变量不再需要使用 return 返回

切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型 默认使用引用传参(即使没有显示的指出指针,类似 PHP 中把对象实例作为函数参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import "fmt"

func main() {
var name int
name = 1
fmt.Println("a初始值",name)
a(&name)
fmt.Println("b更改后,a的值",name)
b(name)
fmt.Println("再次更改后a的值",name)
}

// 按引用传递
func a (a *int){
b := a
*b = 2
fmt.Println("更改b的值",*b)
}

// 按值传递
func b (a int){
b := &a
*b = 3
fmt.Println("再次更改b的值",*b)
}
//a初始值 1
//更改b的值 2
//b更改后,a的值 2
//再次更改b的值 3
//再次更改后a的值 2

返回值以及返回值命名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

import "fmt"

var num int = 10
var numx2,numx3 int

func main() {
numx2,numx3 = getX2AndX3(num)
printValues()
numx2,numx3 = getX2AndX3_2(num)
printValues()
}

func printValues(){
fmt.Printf("num = %d, 2x num = %d, 3x num = %d\n", num, numx2, numx3)
}

func getX2AndX3(input int) (int,int){
//非命名返回值
return 2 * input, 3 * input
}

//这种机制避免了每次进行 return 操作时都要关注函数需要返回哪些返回值,为开发者节省了精力,尤其是在复杂的函数中。
func getX2AndX3_2(input int) (x2 int, x3 int){
//命名返回值
x2 = 2 * input
x3 = 3 * input
//和直接return一样结果
//return x2,x3
//当有命名返回值时,可以直接return,不用关系到底需要返回什么
return
}

//num = 10, 2x num = 20, 3x num = 30
//num = 10, 2x num = 20, 3x num = 30