Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memaparkan dan Menjejaki Nilai Penunjuk Objek Go Sepanjang Hayatnya?
Bagaimanakah Saya Boleh Memaparkan Nilai Penunjuk Objek Go? Membongkar Kepentingan Nilai Penunjuk
Dalam Go, memahami sama ada struct diluluskan oleh nilai atau rujukan adalah penting. Artikel ini menyelami konsep ini dan meneroka teknik untuk mencetak nilai penunjuk objek dalam Go.
Memahami Nilai lwn. Hantaran Rujukan
Fungsi Go lulus hujah mengikut nilai, bermakna fungsi menerima salinan objek asal. Ini menunjukkan bahawa sebarang perubahan yang dibuat pada hujah dalam fungsi tidak menjejaskan objek asal. Sebaliknya, jika struktur diluluskan oleh rujukan, sebarang perubahan yang dibuat dalam fungsi akan ditunjukkan dalam objek asal.
Mendedahkan Nilai Penunjuk dalam Go
Untuk menentukan sama ada struct diluluskan oleh nilai atau rujukan, adalah berguna untuk memeriksa nilai penunjuknya. Dalam Go, & operator mengembalikan penunjuk kepada pembolehubah, yang boleh dicetak menggunakan penentu format %p. Walau bagaimanapun, nilai penunjuk ini mungkin berubah semasa pengumpulan sampah.
Untuk mendapatkan ID objek yang berterusan, menggunakan fungsi runtime.SetFinalizer() adalah disyorkan. Ini melibatkan penyediaan pemuktamad, yang dipanggil sejurus sebelum pemungut sampah mengalihkan objek. Dengan mencipta peta keunikan dalam pemuktamad, anda boleh menetapkan ID unik kepada setiap objek untuk mengenal pastinya sepanjang hayatnya.
Memperluaskan Contoh
Pertimbangkan Go berikut kod:
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) }
Menjalankan kod ini akan mengeluarkan:
0x4930d4 from gotest: 0x4974d8 42 0x4930d4 42
Ini menunjukkan bahawa nilai penunjuk dalam rutin pergi adalah berbeza daripada objek asal, tetapi nilai medan nombor dikemas kini dengan betul.
Kesimpulan
While Go functions pass arguments mengikut nilai, anda masih boleh memeriksa nilai penunjuk untuk memahami gelagat kod anda. Menggunakan teknik seperti menetapkan pemuktamad, anda boleh mendapatkan cerapan tentang identiti objek dan gelagat rujukan, yang boleh membantu terutamanya dalam senario pengaturcaraan serentak.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memaparkan dan Menjejaki Nilai Penunjuk Objek Go Sepanjang Hayatnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!