请选择 进入手机版 | 继续访问电脑版
  • 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

pointers - 传递一个结构体和该结构体的指针有什么区别,难道它们都不都是指针吗?

[复制链接]
菜鸟教程小白 发表于 2022-8-16 06:38:49 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

例如

var myStructRef *Vertex
var myStruct Vertex
myStructRef = &Vertex{2, 3}
myStruct = Vertex{2, 3}

fmt.Println(myStructRef)
fmt.Println(myStruct)
changeByReferenceStruct(myStructRef)
changeByValueStruct(myStruct)
fmt.Println(myStructRef)
fmt.Println(myStruct)


func changeByValueStruct(myStruct Vertex) {
    myStruct.X = 5
    fmt.Println(myStruct)
}


func changeByReferenceStruct(myStruct *Vertex) {
    myStruct.X = 7
    fmt.Println(myStruct)
}
myStructRef *VertexmyStruct Vertex都不是指向结构本身的指针吗?在函数中修改结构时,为什么行为上会有差异?

当golang解析参数时,它会在changeByValueStruct中创建新的结构吗?



Best Answer-推荐答案


当您将指针作为参数传递时,实际情况是创建了该指针的副本并将其传递给基础函数。不应将其与传递引用混淆。
让我们看一个例子来更好地理解它:

package main

import (
    "fmt"
)

type Point struct {
    x int
    y int
}

func (p Point) String() string {
    return fmt.Sprintf("(%d, %d)", p.x, p.y)
}

func modifyValue(point Point) {
    point.x += 10
}

func modifyPointer(point *Point) {
    point.x = 5
    point.y = 5
}

func modifyReference(point *Point) {
    point = &oint{5, 5}
}

func main() {
    p := Point{0, 0}
    fmt.Println(p) // prints (0, 0)
    
    modifyValue(p)
    fmt.Println(p) // prints (0, 0)
    
    modifyPointer(&p)
    fmt.Println(p) // prints (5, 5)
    
    p = Point{0, 0}
    modifyReference(&p)
    fmt.Println(p) // prints (0, 0)
}
ModifyValue 函数内部发生的事情是,对Point结构的完全不同的实例进行了修改,因此调用该函数时传递的值不受影响。
在第二个示例中,传递了指向该结构的指针,以便可以以从​​外部可见的方式修改该结构的字段。
最有趣的一点是最后一个函数 ModifyReference 。如果您熟悉其他语言提供的“按引用传递”范例,则可以完全修改被引用的对象,但这不会发生。这是因为您要修改作为参数传递的指针的副本
您可能想知道,如果一切都是按值传递的,则何时应传递指针以及何时传递值。传递值可确保调用方函数传递的结构不会受到任何更改,因此,在需要此行为时,请选择该值。这样做的缺点是制作了整个对象的副本,如果副本太大,则需要考虑内存问题。
如果要传递大结构作为参数,则使用指针会更好,因为它可以节省空间,但您无法保证对象不会受到任何更改。

关于pointers - 传递一个结构体和该结构体的指针有什么区别,难道它们都不都是指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44872739/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap