golang指针传递和值传递的区别是什么?


本文摘自php中文网,作者青灯夜游,侵删。

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

指针传递与值传递

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

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

值传递

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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)

}

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

1

{Alice Dow}

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

指针传递

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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)

}

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

1

{Bob Dow}

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

变量不能被修改

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

变量是一个大的结构

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

变量是一个map或slice

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

值传递通常开销更小

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

总结

指针传递和值传递的区别

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

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

相关推荐:golang教程

以上就是golang指针传递和值传递的区别是什么?的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

golang中的defer关键字什么时候生效

golang双向链表

手撸golang 行为型设计模式 观察者模式

go语言如何判断变量是slice还是array

golang判断tcp是否断开的方法

计数排序

golang select不阻塞吗

golang xorm mysql代码生成器(java,go)

关于golang里的future/promise

golang 上传office文档并转化为pdf

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...