重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

go语言中指针传递与值传递有什么不同-创新互联

指针

网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、成都小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了钦州免费建站欢迎大家使用!

指针(pointer)在Go语言中可以被拆分为两个核心概念:

类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。

切片,由指向起始元素的原始指针、元素数量和容量组成。

一个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在 32 和 64 位机器上分别占用 4 或 8 个字节,占用字节的大小与所指向的值的大小无关。当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。指针变量通常缩写为 ptr。

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用在变量名前面添加&操作符(前缀)来获取变量的内存地址(取地址操作)

Go允许通过指针(有时称为引用)和值来传递参数。在这篇文章中,我们将比较两种方法,特别注意可能影响选择的不同情境。

指针传递与值传递

严格地说,go方法或函数只有一种传递方式,那就是值传递。每次将一个变量作为参数传递时,都会创建一个新的变量副本并将其传递给所调用的函数或方法。副本分配在不同的内存地址。

在指针传递变量的情况下,将创建指向相同内存地址的新副本。为了感受它们之间的差异,我们来看看它是如何工作的。

值传递

package main

import "fmt"

type Person struct {  
    firstName string
    lastName  string
}

func changeName(p Person) {  
    p.firstName = "Bob"
}

func main() {  
    person := Person {
        firstName: "Alice",
        lastName: "Dow",
    }

    changeName(person)

    fmt.Println(person)
}

运行代码将得到以下输出:

{Alice Dow}

请注意,即使函数changeName将firstName更改为“Bob”,但更改不会影响main函数中的变量person。发生这种情况是因为函数changeName修改了变量person的一个副本,而不是person本身。

指针传递

package main
import "fmt"
type Person struct {  
    firstName string
    lastName  string
}
func changeName(p *Person) {  
    p.firstName = "Bob"
}
func main() {  
    person := Person {
        firstName: "Alice",
        lastName: "Dow",
    }
    changeName(&person)
    fmt.Println(person)
}

运行代码将得到以下输出:

{Bob Dow}

在这种情况下,函数main中的变量person在函数changeName中被修改。发生这种情况是因为&person和p是存储在相同内存地址的相同结构的两个不同指针。

变量不能被修改

我们没有其他的选择,只能通过值传递。所以这个变量不能在下游修改。反之亦然,如果变量被期望修改,它必须通过指针传递。

变量是一个大的结构

如果变量是一个大的结构,性能是一个问题,最好是通过指针传递变量。这样可以避免在内存中复制整个结构。

变量是一个map或slice

Go中的map和slice是引用类型,应该通过值传递。

值传递通常开销更小

即使Go看起来有点像C,它的编译器工作方式也不同。C的类比并不总是和Go一起工作。在Go中值传递可能比指针传递开销更小。发生这种情况是因为Go使用逃逸分析来确定变量是否可以安全地分配到函数的栈帧上,这可能比在堆上分配变量开销小的多。通过值传递可以简化Go中的逃逸分析,并为变量提供更好的分配机会。

总结

指针传递和值传递的区别

1、指针传递传递的是一个地址,而非地址中的数据,传递数据较少,效率较值传递高,一般情况能用指针传递不用值传递。

2、指针传递时,调用函数中对指针所指向空间数据的修改会影响到调用者,因为他们指向的是同一块区域,指传递就不会影响到调用者的数据。

以上就是golang指针传递和值传递的区别是什么?的详细内容,更多请关注创新互联成都网站设计公司其它相关文章!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前名称:go语言中指针传递与值传递有什么不同-创新互联
转载源于:http://cqcxhl.com/article/diohgo.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP