前言:go语言函数参数为值拷贝(指针参数为指针拷贝)。
形参和实参百科
1.普通函数参数
2.特殊函数参数
1.普通函数参数
函数参数类型 | 函数内对形参操作, 是否影响实参? |
---|---|
变量 | 否 |
指针 | 是 |
数组 | 否 |
数组元素 | 否 |
slice | 是 |
package main
import "fmt"
var (
param1 = 1
array2 = [...]int{4, 5, 6}
)
func main() {
t1(param1)
fmt.Printf("t1(param1) = %d\n", param1)
t2(¶m1)
fmt.Printf("t2(param1) = %d\n", param1)
t3(array2)
fmt.Printf("t3(array2) = %+v\n", array2)
t4(array2[0])
fmt.Printf("t3(array2) = %+v\n", array2)
t5(array2[:])
fmt.Printf("t3(array2) = %+v\n", array2[:])
func1 := f1
t6(param1, func1)
fmt.Printf("t6(param1, f1) = %d\n", param1)
}
// 1.变量(值拷贝)
func t1(tmp int) {
tmp++
}
// 2.指针(地址拷贝)
func t2(tmp *int) {
*tmp++
}
// 3.数组(值拷贝)
func t3(arr [3]int) {
arr[0] = 1
}
// 4.数组元素(值拷贝)
func t4(tmp int) {
tmp++
}
// 5.slice(地址拷贝)
func t5(s1 []int) {
s1[0]++
}
// 6.函数(直接调用)
func t6(a int, f1 func(*int)) {
f1(&a)
fmt.Printf("f1(&a) = %d\n", a)
}
func f1(a *int) {
*a++
}
2.特殊函数参数
在go语言中,函数也作为一种数据类型,所以函数也可以作为函数的参数来使用。
# 变量func1数据类型为f1,在函数t6内对f1的调用实际为函数调用。
func main(){
func1 := f1
t6(param1, func1)
fmt.Printf("t6(param1, f1) = %d\n", param1)
}
func t6(a int, f1 func(*int)) {
f1(&a)
fmt.Printf("f1(&a) = %d\n", a)
}
func f1(a *int) {
*a++
}
总结
其中slice是为地址数组指针的拷贝⚠️,持续更新中 ....
附录:
github func
网友评论