Rumah >pembangunan bahagian belakang >Golang >Mengapa Saya Tidak Boleh Memanggil Kaedah Penerima Penunjuk pada Indeks Go Map?

Mengapa Saya Tidak Boleh Memanggil Kaedah Penerima Penunjuk pada Indeks Go Map?

Susan Sarandon
Susan Sarandonasal
2024-12-29 13:01:11616semak imbas

Why Can't I Call a Pointer Receiver Method on a Go Map Index?

Menujuk Indeks Peta dalam Go

Apabila memanipulasi nilai dalam peta, adalah penting untuk mengetahui kelakuan penerima penunjuk untuk peta entri. Perangkap biasa timbul apabila cuba memanggil kaedah penerima penunjuk pada indeks peta, seperti yang ditunjukkan oleh kod di bawah:

package main

import "fmt"

type item struct {
    itemName string
    amount   int
}

type Cashier struct {
    items map[int]item
    cash  int
}

func (i *item) GetAmount() int {
    return i.amount
}

func main() {
    x := Cashier{}
    x.AddItem("item1", 13)
    f := x.GetItems()

    fmt.Println(f[0].GetAmount()) // Error: cannot call pointer method on f[0]
}

Dalam kod ini, kaedah GetAmount ditakrifkan sebagai penerima penunjuk untuk memanipulasi item secara langsung struct. Walau bagaimanapun, apabila anda memanggil f[0].GetAmount(), anda menerima ralat "tidak boleh memanggil kaedah penunjuk pada f[0]". Ini kerana entri peta tidak boleh ditangani secara langsung disebabkan oleh potensi perubahan dalam alamatnya apabila peta berkembang atau mengecut.

Punca gelagat ini terletak pada cara Go melaksanakan peta. Peta diwakili secara dalaman sebagai jadual cincang yang mungkin diubah saiz semasa masa jalan untuk mengoptimumkan prestasi. Akibatnya, alamat entri peta mungkin berubah dari semasa ke semasa, menjadikannya tidak sah untuk dihantar sebagai hujah kepada kaedah penerima penunjuk.

Untuk menyelesaikan isu ini, satu pendekatan adalah dengan mencipta salinan peta entri dan bukannya menggunakan penerima penunjuk. Ini boleh dicapai dengan mula-mula mendapatkan semula nilai daripada peta menggunakan indeks dan kemudian mencipta salinan nilai tersebut:

func main() {
    x := Cashier{}
    x.AddItem("item1", 13)
    f := x.GetItems()

    itemCopy := f[0]
    fmt.Println(itemCopy.GetAmount()) // No error
}

Dalam kes ini, itemCopy ialah salinan nilai yang disimpan di f[0] , dan ia boleh digunakan untuk memanggil kaedah penerima penunjuk tanpa menghadapi ralat.

Dengan memahami gelagat penerima penunjuk dengan entri peta, pembangun boleh mengelakkan perkara ini perangkap dan tulis kod yang beroperasi dengan betul pada nilai peta.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Memanggil Kaedah Penerima Penunjuk pada Indeks Go Map?. 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