Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Semantik Pass-by-Value Go Mempengaruhi Manipulasi Penunjuk Struktur?

Bagaimanakah Semantik Pass-by-Value Go Mempengaruhi Manipulasi Penunjuk Struktur?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-03 15:55:12994semak imbas

How Do Go's Pass-by-Value Semantics Affect Struct Pointer Manipulation?

Memeriksa Nilai Penunjuk Objek dalam Go

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:

  • Dalam fungsi utama, sebelum memanggil gotest, nilai penunjuk s adalah sama dengan nilai penunjuk ungkapan &s, menunjukkan bahawa s sememangnya penunjuk.
  • Dalam fungsi mendapat, nilai penunjuk &s adalah berbeza daripada nilai penunjuk s, mengesahkan bahawa s ialah salinan penunjuk dalam utama fungsi.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn