在 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 表达式,我们可以观察执行各个阶段的指针值。输出显示:
此行为与 Go 的按值传递语义一致,其中参数被复制到函数的作用域中。因此,如果你想修改原始结构,你应该传递一个指向它的指针而不是结构本身。
以上是Go 的值传递语义如何影响结构指针操作?的详细内容。更多信息请关注PHP中文网其他相关文章!