首页 > 后端开发 > Golang > 为什么当我们返回一个结构体而不是指向结构体的指针时我们不能赋值?

为什么当我们返回一个结构体而不是指向结构体的指针时我们不能赋值?

WBOY
发布: 2024-02-09 17:30:10
转载
999 人浏览过

为什么当我们返回一个结构体而不是指向结构体的指针时我们不能赋值?

在C语言中,当我们返回一个结构体而不是指向结构体的指针时,我们无法直接进行赋值的原因是,返回结构体时会复制整个结构体的内容,而不是返回指向结构体的指针。由于结构体可能包含大量的数据,复制整个结构体的代价可能会很高。因此,为了提高效率,C语言规定了当返回结构体时,我们只能通过将其赋值给一个结构体类型的变量来使用它。这样可以避免不必要的复制操作,提高代码的执行效率。

问题内容

假设我们有以下结构

type profile struct {
    id   int
    name string
}

func test(p profile) profile {
    return p
}

func main() {
    var profile profile
    test(profile).id = 20 // cannot assign to test(profile).id (value of type int)
}
登录后复制

但是如果我们将测试函数返回类型的 profile 更改为 *profile,main 函数就可以工作。

func test(p Profile) *Profile {
    return &p
}

func main() {
    var profile Profile
    test(profile).id = 20 // Works
}
登录后复制

为什么会这样?

解决方法

以这种方式分配给 Profile 的字段没有明显的效果。您正在分配一个临时结构体值(的字段),然后立即将其丢弃。注意test的返回值是main中profile的副本;它被复制到测试的参数中,然后在从测试返回时再次复制。

当返回指针时,至少在原则上,指向的结构在赋值后仍然可以访问(尽管在这种特定情况下不是这样,因为指针指向要测试的参数的副本)。

以上是为什么当我们返回一个结构体而不是指向结构体的指针时我们不能赋值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板