go语言:函数参数传递详解
参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程。比较常见的参数传递有:值传递,按地址传递参数或者按数组传递参数.
1、常规传递
使用普通变量作为函数参数的时候,在传递参数时只是对变量值的拷贝,即将实参的值复制给变参,当函数对变参进行处理时,并不会影响原来实参的值。
egg:
package main
import "fmt"
func aa(a, b int) {
var temp int
temp = a
a = b
b = temp
fmt.Println(a, b)//处理了a,b交换的值
}
func main() {
x := 5
y := 10
aa(x, y)
fmt.Println(x, y)//交换后还是打印原来的值
}
输出结果:
C:/Users/cherry/go/src/aa/aa.exe [C:/Users/cherry/go/src/aa]
10 5
5 10
成功: 进程退出代码 0.
2、指针函数
函数的变量不仅可以使用普通变量,还可以使用指针变量,使用指针变量作为函数的参数时,在进行参数传递时将是一个地址,即将实参的内存地址复制给变参,这时变参的修改也将会影响到实参的值。
egg:
package main
import "fmt"
func aa(a *int, b *int) {
var temp int
temp = *a
*a = *b
*b = temp
//fmt.Println(temp, *a, *b)
}
func main() {
x := 5
y := 10
aa(&x, &y)
fmt.Println(x, y)
}
执行结果:
C:/Users/cherry/go/src/aa/aa.exe [C:/Users/cherry/go/src/aa]
10 5
成功: 进程退出代码 0.
3、数组元素作为函数参数
使用数组元素作为参数时,其使用的方法和普通变量相同,既是一个"值拷贝"
package main
import "fmt"
func aa(a int) {
a += 100
fmt.Printf("打印内部的累加后的值:%d\n", a)
}
func main() {
var s = [...]int{1, 2, 3, 4, 5, 6}
fmt.Printf("开始调用函数....\n")
aa(s[3])
fmt.Printf("调用结束...")
fmt.Println(s[3])
}
执行结果:
C:/Users/cherry/go/src/aa/aa.exe [C:/Users/cherry/go/src/aa]
开始调用函数....
打印内部的累加后的值:104
调用结束...4
成功: 进程退出代码 0.
4、数组名作为函数参数:和其他语言不同的是,GO语言在将数组名字作为函数参数的时候,参数传递既是对数组的复制,在形参中对数组元素的修改都不会影响到数组元素的原来的值,CODE如下:
package main
import "fmt"
func aa(s [6]int) {
s[3] += 100
fmt.Printf("打印内部的累加后的值:%d\n", s)
}
func main() {
var s = [...]int{1, 2, 3, 4, 5, 6}
fmt.Printf("开始调用函数....\n")
aa(s)
fmt.Printf("调用结束...")
fmt.Println(s)
}
执行结果:
C:/Users/cherry/go/src/aa/aa.exe [C:/Users/cherry/go/src/aa]
开始调用函数....
打印内部的累加后的值:[1 2 3 104 5 6]
调用结束...[1 2 3 4 5 6]
##将数组作为参数传入时,必须指定传入数组的长度和初始定义长度一样
5、slice作为函数参数
在使用sclice作为函数参数时,进行参数传递将是一个地址拷贝,即将底层数组的内存地址复制给参数slice,对slice元素的操作就是对底层数组元素的操作。
egg:
package main
import "fmt"
func aa(s1 []int) {
s1[0] += 100
}
func main() {
var a = [5]int{1, 2, 3, 4, 5}
var s []int = a[0:]
aa(s)
fmt.Println(s[0])
fmt.Println(a)
}
执行结果:
C:/Users/cherry/go/src/aa/aa.exe [C:/Users/cherry/go/src/aa]
101
[101 2 3 4 5]//原数组的的值发生了变化
6、函数作为参数:GO语言中,函数也作为一种数据类型,所以函数也可以作为函数的参数来使用。
package main
import "fmt"
func aa(a, b int, bb func(int, int) int) {
fmt.Println(bb(a, b))
}
func bb(a, b int) int {
return a + b
}
func main() {
var a, b int = 5, 6
f := bb
fmt.Println(f)
aa(a, b, f)
fmt.Println(a, b, f)
}
函数bb作为函数aa的形参,而变量f是一个函数类型,作为aa()调用时的实参