首页 > 后端开发 > Golang > Go 的值传递语义如何影响结构指针操作?

Go 的值传递语义如何影响结构指针操作?

Mary-Kate Olsen
发布: 2024-12-03 15:55:12
原创
1011 人浏览过

How Do Go's Pass-by-Value Semantics Affect Struct Pointer Manipulation?

检查 Go 中的对象指针值

在 Go 中,函数参数是按值传递的,这意味着对函数内参数所做的任何更改都不会影响原始参数函数之外的值。在处理结构时,这可能会令人困惑,因为您可能希望它们通过引用传递。

要了解其工作原理,请考虑以下代码片段:

package main

import (
    "fmt"
    "runtime"
)

type Something struct {
    number int
    queue  chan int
}

func gotest(s *Something, done chan bool) {
    fmt.Printf("from gotest:\n&s: %p\n", &s)
    for num := range s.queue {
        fmt.Println(num)
        s.number = num
    }
    done <- true
}

func main() {
    runtime.GOMAXPROCS(4)
    s := &Something{number: 42}
    fmt.Printf("&s: %p\n", &s)

    s.queue = make(chan int)
    done := make(chan bool)

    go gotest(s, done)
    s.queue <- 43

    close(s.queue)
    <-done

    fmt.Printf("&s: %p\n", &s)
    fmt.Println(s.number) // Output: 43
}
登录后复制

此代码演示按值传递结构指针。在 main 函数中,我们创建 Something 的实例,并将指向它的指针传递给 gotest 函数。

在 gotest 函数中,我们修改结构体的 number 字段,并将消息传递到其队列通道。 gotest 函数对指针的副本进行操作,因此它所做的任何更改都不会影响主函数中的原始结构。

使用 &s 表达式,我们可以观察执行各个阶段的指针值。输出显示:

  • 在main函数中,在调用gotest之前,s的指针值与&s表达式的指针值相同,说明s确实是一个指针。
  • gotest函数内,&s的指针值与s的指针值不同,确认s是main中指针的副本function.

此行为与 Go 的按值传递语义一致,其中参数被复制到函数的作用域中。因此,如果你想修改原始结构,你应该传递一个指向它的指针而不是结构本身。

以上是Go 的值传递语义如何影响结构指针操作?的详细内容。更多信息请关注PHP中文网其他相关文章!

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