美文网首页
Go 函数参数传递详解

Go 函数参数传递详解

作者: parker7 | 来源:发表于2018-10-16 15:13 被阅读0次

    前言: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

    相关文章

      网友评论

          本文标题:Go 函数参数传递详解

          本文链接:https://www.haomeiwen.com/subject/lewbaftx.html