如何顯示Go物件的指標值?揭示指標值的意義
在 Go 中,理解結構體是按值傳遞還是按引用傳遞至關重要。本文深入探討這個概念,並探討在 Go 中列印物件指標值的技術。
理解值與引用傳遞
Go 函數透過以下方式傳遞參數value,表示函數接收原始物件的副本。這意味著對函數內參數所做的任何更改都不會影響原始物件。相反,如果結構體通過引用傳遞,則函數內所做的任何更改都會反映在原始物件中。
揭示Go中的指標值
要確定結構體是按值傳遞還是按引用傳遞,檢查其指標值會很有幫助。在 Go 中,& 運算子傳回指向變數的指針,可以使用 %p 格式說明符列印該變數。但是,該指標值在垃圾回收期間可能會發生變化。
要取得持久性物件ID,建議使用runtime.SetFinalizer()函數。這涉及到提供一個終結器,該終結器在垃圾收集器刪除物件之前被呼叫。透過在終結器中建立唯一性映射,您可以為每個物件分配一個唯一的 ID,以在其整個生命週期中對其進行識別。
擴充範例
考慮以下Go程式碼:
package main import ( "fmt" "runtime" ) type Something struct { number int queue chan int } func gotest(s *Something, done chan bool) { fmt.Println("from gotest:") fmt.Println(&s) for num := range s.queue { fmt.Println(num) s.number = num } done <- true } func main() { runtime.GOMAXPROCS(4) s := new(Something) fmt.Println(&s) s.queue = make(chan int) done := make(chan bool) go gotest(s, done) s.queue <- 42 close(s.queue) <-done fmt.Println(&s) fmt.Println(s.number) }
執行此程式碼將輸出:
0x4930d4 from gotest: 0x4974d8 42 0x4930d4 42
這表示go例程中的指標值與原始物件不同,但數字欄位的值被正確更新。
結論
雖然 Go 函數以值傳遞參數,但您仍然可以檢查指標值以了解程式碼的行為。使用設定終結器等技術,您可以深入了解物件的標識和引用行為,這在並發程式設計場景中特別有用。
以上是如何在 Go 物件的整個生命週期中顯示和追蹤其指標值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!