golang之参数传递

参数传递

首先,在变量分配空间和参数传递上,go是和c很相似的,都是默认在栈上分配,内存分配在内存模型中有写到,在这里不做赘述了。

由于go语言默认在栈上分配空间,所以参数传递默认是值传递的,无论你是数组还是对象,传入参数后在函数内修改都是修改的变量副本,当此函数出栈后这个变量副本也被销毁,无法影响到原对象,除非你返回这个变量然后赋给原变量。

ps: 实际上我们说的引用传递本质也是值传递,只不过传递的值是地址,所以可以修改原变量。

  1. 基本数据类型传递

    package main
    import (
        "fmt"
    )
    func swap(a int, b int) {
        var temp int
        temp = a
        a = b
        b = temp
    }
    func main() {
        x := 5
        y := 10
        swap(x, y)
        fmt.Print(x, y)
    }
    
  2. 数组类型传递

    package main
    
    import "fmt"
    
    func swap(arr [2]int){
    	arr[1],arr[0]=arr[0],arr[1]
    }
    func main() {
    	a:=[2]int{0,1}
    	swap(a)
    	fmt.Print(a)
    }
    
    

    数组也是值传递,打印结果为[0 1]

  3. 指针类型传递

    func swap(a *int,b *int){
    	*a ,*b = *b,*a
    }
    func main() {
    	a:=1
    	b:=2
    	swap(&a,&b)
    	fmt.Print(a,b)
    }
    
    

    对变量&运算获取其地址,然后传入,直接修改该地址里的内容,其打印结果为 2 1

  4. slice类型传递

    在使用slice作为函数参数时,进行参数传递将是一个地址拷贝,即将底层数组的内存地址复制给参数slice。这时,对slice元素的操作就是对底层数组元素的操作。通常如果我们相对数组操作,会把数组变为切片传入。

    package main
    import (
        "fmt"
    )
    func function(s1 []int) {
        s1[0] += 100
    }
    func main() {
        var a = [5]int{1, 2, 3, 4, 5}
        var s []int = a[:]
        function(s)
        fmt.Println(s[0])
    }
    
  5. 函数类型传

    在go语言中,函数也作为一种数据类型,所以函数也可以作为函数的参数来使用。例如:

    package main
    import (
        "fmt"
    )
    func function(a, b int, sum func(int, int) int) {
        fmt.Println(sum(a, b))
    }
    func sum(a, b int) int {
        return a + b
    }
    func main() {
        var a, b int = 5, 6
        f := sum
        function(a, b, f)
    }
    
发布了16 篇原创文章 · 获赞 3 · 访问量 1350

猜你喜欢

转载自blog.csdn.net/weixin_40631132/article/details/105208360
今日推荐