PHP 怎样理解go指针,golang指针传递和值传递的区别是什么?
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指针传递和值传递的区别是什么?相关推荐
- java引用传递_理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...
- 创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)
函数参数传递的两种方式为值传递和引用传递 目录 函数参数传递的两种方式为值传递和引用传递 1.传值方式传参 2.引用方式传参 3.通过一段代码运行进一步理解传指针(包括二级指针)和传指针的引用 4.总 ...
- go slice获取唯一值_Go语言引用传递与值传递
先说结论 GO中只有值传递,没有引用传递 所谓值传递,就是实参通过拷贝将自身内容传递给形参.也就是将传递的内容拷贝一份,给函数.所以函数外和函数里对这个参数地址求值,应该是不一样的. 证明如下: fu ...
- C#中方法参数的引用传递、值传递。
一.值类型和引用类型 C# 中的类型一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type). 值类型包括结构体(struct)和枚举(enum). 引用类型 ...
- python引用传递和值传递的区别_Python 值传递和引用传递
值传递和引用传递 python的值传递不会改变传入参数的值,而引用传递传入的是一个地址,有点类似c的指针,在执行完成之后会改变传入地址所指的值. 值传递类型如下: 上面的代码只是将a的值作为参数传递进 ...
- 一道关于引用传递和值传递的JS题
先看题1 var obj = {name:"a"} function bar(obj) {console.log(obj.name);obj = {name:"b&quo ...
- java还值_Java到底是引用传递还是值传递
前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test(){ String str = "hello"; change(str); S ...
- java是引用传递还是值传递_流言终结者:Java是引用传递还是值传递?
前言 今天聊一个很小的话题,引用传递和值传递.为什么拉出这个话题呢?因为自己太菜吧-在这上边栽了跟头.所以今天就聊一聊Java中是引用传递还是值传递. 正文 小A:MDove,我有一个疑问:Java的 ...
- Java到底是引用传递还是值传递
前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test() {String str = "hello";change(str);Sys ...
最新文章
- ORA-00942:表或视图不存在(低级错误)
- 如何用R进行单因素方差分析
- 28.进程和程序的区别
- 【转】矩阵的几何解释
- linux prelink.cache,Linux基础操作
- 【音乐】想不起来歌名的瞎唱
- mysql8.0.13可以用在生产环境_(13)生产环境出现大量DB死锁
- 搜索的php mysql代码生成器_四款强大的PHP代码生成器
- 关于图像三通道和单通道的解释
- MySQL 5.7--多源复制(非GTID模式)
- 产业互联网的“神”在哪里?
- 如何为Linux系统中的SSH添加双重认证
- visual studio怎么用_自从用了敏捷,天天在开会?4大Scrum会议如何才能有意义?...
- 计算机微课论文参考文献,关于信息技术论文范文资料 与初中信息技术课堂中微课应用策略有关论文参考文献...
- 谷歌翻译突然用不了了
- R语言检验时间序列中是否存在自相关性:使用box.test函数执行box-pierce检验验证时间序列中是否存在自相关性
- SMPL 人体模型简要
- python画名侦探柯南_Python实战爬B站 | 帮你梳理柯南主线剧情+弹幕
- mysql80004005错误_常见的80004005错误及其解决方法
- 人人网,给我个“上”你的理由吧?