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