Rumah >pembangunan bahagian belakang >Golang >Mengapa Penambahan Slice Struktur Tidak Berfungsi Apabila Dipanggil Daripada Kaedah Lain?

Mengapa Penambahan Slice Struktur Tidak Berfungsi Apabila Dipanggil Daripada Kaedah Lain?

Linda Hamilton
Linda Hamiltonasal
2024-12-19 13:08:14219semak imbas

Why Doesn't Appending to a Struct Slice Work in Go When Called From Another Method?

Tidak Boleh Menambahkan pada Struct Slice Di Luar Kaedah

Apabila bekerja dengan slice dalam Go, isu biasa timbul apabila menambahkan pada slice yang sifat sesuatu struct. Dalam senario tertentu, operasi ini mungkin gagal walaupun berfungsi dengan betul apabila dilakukan secara langsung pada struct.

Pertimbangkan contoh berikut:

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
}

Di sini, kod berjaya ditambahkan pada semua kepingan dalam kaedah jalankan struct Test1. Walau bagaimanapun, jika kaedah ini memanggil kaedah lain, operasi tambah gagal.

Contohnya:

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)
  }
}

Dalam senario ini, kaedah Test3.combo cuba untuk menambah pada semua kepingan tetapi gagal . Sebab untuk ini ialah Go melepasi nilai mengikut nilai, bermakna salinan struct Test3 dicipta apabila c.combo() dipanggil.

Salinan beroperasi pada kepingannya sendiri, dan apabila kaedah itu kembali, perubahan yang berkaitan dibuang. Oleh itu, apabila Test3.run cuba mengembalikan c.all, ia mengembalikan kepingan kosong kerana versi ubah suai salinan hilang.

Penyelesaian kepada isu ini ialah menggunakan penerima penunjuk untuk kaedah kombo:

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

Menggunakan penerima penuding memastikan kaedah tersebut beroperasi pada struct Test3 asal, membenarkan perubahan yang dibuat dalam kaedah kombo dikekalkan apabila ia kembali.

Atas ialah kandungan terperinci Mengapa Penambahan Slice Struktur Tidak Berfungsi Apabila Dipanggil Daripada Kaedah Lain?. 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