Rumah >pembangunan bahagian belakang >Golang >Mengapa Saya Mendapat Ralat 'Kaedah Tidak Ditakrifkan' Semasa Memanggil Kaedah pada Penunjuk Antara Muka dalam Go?

Mengapa Saya Mendapat Ralat 'Kaedah Tidak Ditakrifkan' Semasa Memanggil Kaedah pada Penunjuk Antara Muka dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-12-14 14:33:15756semak imbas

Why Do I Get an

Kaedah Memanggil pada Penunjuk Antara Muka di Golang

Apabila bekerja dengan perpustakaan Gorp untuk akses pangkalan data, pembangun sering menghadapi keperluan untuk memanggil kaedah pada penunjuk antara muka sambil mengekalkan keupayaan untuk melancarkan urus niaga. Isu ini timbul daripada keperluan untuk meluluskan contoh Gorp DbMap atau Transaction sebagai sifat medan.

Masalahnya

Seperti yang ditunjukkan dalam kod contoh, cuba memanggil kaedah pada antara muka SqlExecutor menggunakan rujukan penuding menghasilkan ralat kaedah yang tidak ditentukan. Ini berlaku kerana jenis *gorp.SqlExecutor tidak mempunyai kaedah Dapatkan, manakala antara muka gorp.SqlExecutor itu sendiri.

Penyelesaian

Kesalahpahaman yang mendasarinya terletak pada andaian bahawa menghantar penunjuk kepada nilai antara muka memberikan kelakuan yang sama seperti panggilan melalui rujukan dalam bahasa lain. Dalam Go, penunjuk kepada antara muka digunakan untuk dua sebab tertentu:

  1. Untuk mengoptimumkan prestasi apabila menghantar nilai struct yang besar.
  2. Untuk membenarkan penerima mengubah suai nilai asal (apabila kaedah mempunyai penerima penuding).

Kedua-dua sebab ini tidak terpakai pada penunjuk kepada antara muka, kerana nilai antara muka sudah kecil dan tidak boleh diubah suai melalui nilai antara muka itu sendiri. Sebaliknya, adalah perlu untuk mengubah suai nilai yang disimpan di dalam nilai antara muka, yang selalunya penunjuk kepada struktur sebenar.

Pelaksanaan Betul

Untuk menyelesaikan isu, kod harus mengelak daripada menghantar penunjuk kepada "objek" Gorp dan sebaliknya lulus nilai antara muka secara langsung. Kod berikut melaksanakan pendekatan ini dengan betul:

package repositories

import "github.com/coopernurse/gorp"

type Repository struct {
    Gorp gorp.SqlExecutor // Pass the interface value directly
}

func (r Repository) GetById(i interface{}, key interface{}) interface{} {
    obj, err := r.Gorp.Get(i, key)
    if err != nil {
        panic(err)
    }
    return obj
}

Dengan menghantar nilai antara muka mengikut nilai dan bukan dengan rujukan, kod boleh mengekalkan kefungsian yang diperlukan sambil mematuhi penggunaan penunjuk yang betul dalam Go.

Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat 'Kaedah Tidak Ditakrifkan' Semasa Memanggil Kaedah pada Penunjuk Antara Muka dalam Go?. 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