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
Lepaskan: 2024-12-29 13:01:11
asal
593 orang telah melayarinya

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]
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan