Go语言值传递和指针传递(引用传递)

Admin 2019-05-07 10:59:47 GoLang

总的来说Go的函数只有一种传递方式,就是值传递。将一个变量作为参数传递时,都会创建一个新的变量副本并将其传递给所调用的函数,副本分配在不同的内存地址,在指针传递变量的情况下,将创建指向相同内存地址的新副本。

package main

import (

    "fmt"
)

type self struct {
    Name string
}

func (s self) self_change_name(name string){    //值传递 拷贝一份self
    s.Name = name
}

func (s *self) police_station_change_name(name string){  //指针传递 指向self
    s.Name = name
}

func main() {
    s := self{"A"}  // 初始化A
    s.self_change_name("B")  //改成B,但并未生效
    fmt.Println(s.Name)

    s.police_station_change_name("C")
    fmt.Println(s.Name)
}
# 结果
A
C

在Go中值传递通常开销比指针较小,这是因为Go使用逃逸分析来确定变量是否可以安全地分配到函数的栈帧上,可能比在堆上分配变量开销小的多,通过值传递可以简化Go中的逃逸分析,并为变量提供更好的分配机会。如果变量是一个大的结构,性能是一个问题,最好是通过指针传递变量。这样可以避免在内存中复制整个结构。如非特殊情况下建议还是使用值传递。

相关文章
最新推荐