首頁 >後端開發 >Golang >Go 的值傳遞語意如何影響結構指標操作?

Go 的值傳遞語意如何影響結構指標操作?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-03 15:55:121012瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn