Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Semantik Pass-by-Value Go Mempengaruhi Manipulasi Penunjuk Struktur?
Dalam Go, argumen fungsi diluluskan mengikut nilai, bermakna sebarang perubahan yang dibuat pada argumen dalam fungsi tidak menjejaskan asal nilai di luar fungsi. Ini boleh mengelirukan apabila berurusan dengan struct, kerana anda mungkin menjangkakan ia akan diluluskan melalui rujukan.
Untuk memahami cara ini berfungsi, pertimbangkan coretan kod berikut:
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 }
Kod ini menunjukkan menghantar penunjuk struct mengikut nilai. Dalam fungsi utama, kami mencipta tika Sesuatu dan menghantar penuding kepadanya kepada fungsi mendapat.
Dalam fungsi mendapat, kami mengubah suai medan nombor struct dan juga menghantar mesej ke saluran baris gilirnya. Fungsi gotest beroperasi pada salinan penuding, jadi sebarang perubahan yang dibuatnya tidak akan menjejaskan struct asal dalam fungsi utama.
Menggunakan ungkapan &s, kita boleh memerhatikan nilai penuding pada pelbagai peringkat pelaksanaan. Output menunjukkan bahawa:
Tingkah laku ini konsisten dengan semantik pass-by-value Go, di mana argumen disalin ke dalam skop fungsi. Oleh itu, jika anda ingin mengubah suai struct asal, anda harus memberikan penunjuk kepadanya dan bukannya struct itu sendiri.
Atas ialah kandungan terperinci Bagaimanakah Semantik Pass-by-Value Go Mempengaruhi Manipulasi Penunjuk Struktur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!