Go 函数参数传递详解


前言: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(&param1)
    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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容