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

PHP 怎样理解go指针,golang指针传递和值传递的区别是什么?相关推荐

  1. java引用传递_理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...

  2. 创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)

    函数参数传递的两种方式为值传递和引用传递 目录 函数参数传递的两种方式为值传递和引用传递 1.传值方式传参 2.引用方式传参 3.通过一段代码运行进一步理解传指针(包括二级指针)和传指针的引用 4.总 ...

  3. go slice获取唯一值_Go语言引用传递与值传递

    先说结论 GO中只有值传递,没有引用传递 所谓值传递,就是实参通过拷贝将自身内容传递给形参.也就是将传递的内容拷贝一份,给函数.所以函数外和函数里对这个参数地址求值,应该是不一样的. 证明如下: fu ...

  4. C#中方法参数的引用传递、值传递。

    一.值类型和引用类型 C# 中的类型一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type). 值类型包括结构体(struct)和枚举(enum). 引用类型 ...

  5. python引用传递和值传递的区别_Python 值传递和引用传递

    值传递和引用传递 python的值传递不会改变传入参数的值,而引用传递传入的是一个地址,有点类似c的指针,在执行完成之后会改变传入地址所指的值. 值传递类型如下: 上面的代码只是将a的值作为参数传递进 ...

  6. 一道关于引用传递和值传递的JS题

    先看题1 var obj = {name:"a"} function bar(obj) {console.log(obj.name);obj = {name:"b&quo ...

  7. java还值_Java到底是引用传递还是值传递

    前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test(){ String str = "hello"; change(str); S ...

  8. java是引用传递还是值传递_流言终结者:Java是引用传递还是值传递?

    前言 今天聊一个很小的话题,引用传递和值传递.为什么拉出这个话题呢?因为自己太菜吧-在这上边栽了跟头.所以今天就聊一聊Java中是引用传递还是值传递. 正文 小A:MDove,我有一个疑问:Java的 ...

  9. Java到底是引用传递还是值传递

    前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test() {String str = "hello";change(str);Sys ...

最新文章

  1. ORA-00942:表或视图不存在(低级错误)
  2. 如何用R进行单因素方差分析
  3. 28.进程和程序的区别
  4. 【转】矩阵的几何解释
  5. linux prelink.cache,Linux基础操作
  6. 【音乐】想不起来歌名的瞎唱
  7. mysql8.0.13可以用在生产环境_(13)生产环境出现大量DB死锁
  8. 搜索的php mysql代码生成器_四款强大的PHP代码生成器
  9. 关于图像三通道和单通道的解释
  10. MySQL 5.7--多源复制(非GTID模式)
  11. 产业互联网的“神”在哪里?
  12. 如何为Linux系统中的SSH添加双重认证
  13. visual studio怎么用_自从用了敏捷,天天在开会?4大Scrum会议如何才能有意义?...
  14. 计算机微课论文参考文献,关于信息技术论文范文资料 与初中信息技术课堂中微课应用策略有关论文参考文献...
  15. 谷歌翻译突然用不了了
  16. R语言检验时间序列中是否存在自相关性:使用box.test函数执行box-pierce检验验证时间序列中是否存在自相关性
  17. SMPL 人体模型简要
  18. python画名侦探柯南_Python实战爬B站 | 帮你梳理柯南主线剧情+弹幕
  19. mysql80004005错误_常见的80004005错误及其解决方法
  20. 人人网,给我个“上”你的理由吧?

热门文章

  1. 前台js获取url传递参数(后台Request.QueryString接收)
  2. Java中volatile关键字实现原理
  3. crontab 定时备份 出现permission:denied
  4. day1:作业 编写登录接口并画出相应的流程图
  5. linux下编译C++程序无法链接Mysql的问题
  6. 算法导论 CLRS 23.3 解答 (未完成)
  7. C#点滴 – 内建基本类型
  8. 添加git 忽略文件
  9. webstorm的个性化设置settings
  10. Postman怎么用?