Rumah >pembangunan bahagian belakang >Golang >Mengapakah Saya Memerlukan Penerima Penunjuk untuk Dipasang pada Slice dalam Go Struct?

Mengapakah Saya Memerlukan Penerima Penunjuk untuk Dipasang pada Slice dalam Go Struct?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-27 17:39:12270semak imbas

Why Do I Need a Pointer Receiver to Append to a Slice in a Go Struct?

Melampirkan pada Slice Properties dalam Go Structs

Apabila cuba menambahkan nilai pada slice property dalam Go struct, anda mungkin menghadapi gelagat yang tidak dijangka jika perintah panggilan tertentu tidak diikuti. Artikel ini meneroka sebab di sebalik isu ini dan menyediakan penyelesaian.

Dalam contoh kod yang disediakan, tiga kaedah ditakrifkan dalam jenis struct yang berbeza untuk menunjukkan isu tersebut. Test1 dan Test2 berfungsi seperti yang diharapkan kerana kaedah run() mereka beroperasi secara langsung pada sifat slice. Walau bagaimanapun, dalam Test3, kaedah kombo() dipanggil daripada run() menggunakan penerima nilai dan bukannya penerima penunjuk.

Mengapa Penerima Penunjuk Diperlukan

Dalam Go, semua nilai dihantar mengikut nilai, bermakna salinan nilai yang diluluskan dibuat apabila memanggil fungsi atau kaedah. Dalam kes Test3, salinan nilai Test3 dibuat apabila combo() dipanggil dan pengubahsuaian pada sifat slice dalam salinan ini tidak ditunjukkan dalam struct Test3 asal.

Dengan menggunakan penerima penuding , seperti func (c *Test3) combo(), struct Test3 asal diubah suai secara langsung, menghapuskan isu copy-local perubahan.

Penyelesaian

Penyelesaian adalah untuk menukar jenis penerima kaedah kombo() kepada penerima penunjuk. Ini memastikan bahawa struct Test3 asal sedang diubah suai oleh kaedah.

Kod Kemas Kini

package main

import (
  "fmt"
)

type Test1 struct {
  all []int
}

func (c Test1) run() []int {
  for i := 0; i < 2; i++ {
    c.all = append(c.all, i)
  }
  return c.all
}

var gloabl_all []int

type Test2 struct {}

func (c Test2) run() []int {
  c.combo()
  return gloabl_all
}

func (c Test2) combo() {
  for i := 0; i < 2; i++ {
    gloabl_all = append(gloabl_all, i)
  }
}

type Test3 struct {
  all []int
}

func (c Test3) run() []int {
  c.combo()
  return c.all
}

func (c *Test3) combo() {
  for i := 0; i < 2; i++ {
    c.all = append(c.all, i)
    fmt.Println("Test3 step", i + 1, c.all)
  }
}

func main() {
  test1 := &Test1{}
  fmt.Println("Test1 final:", test1.run())

  test2 := &Test2{}
  fmt.Println("Test2 final:", test2.run())

  test3 := &Test3{}
  fmt.Println("Test3 final:", test3.run())
}

Output

Test1 final: [0 1]
Test2 final: [0 1]
Test3 step 1 [0]
Test3 step 2 [0 1]
Test3 final: [0 1]

Atas ialah kandungan terperinci Mengapakah Saya Memerlukan Penerima Penunjuk untuk Dipasang pada Slice dalam Go Struct?. 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