Rumah >pembangunan bahagian belakang >Golang >Bagaimana Cara Memanggil Kaedah pada Penunjuk Antara Muka dalam Go?

Bagaimana Cara Memanggil Kaedah pada Penunjuk Antara Muka dalam Go?

DDD
DDDasal
2024-12-14 19:31:11205semak imbas

How to Correctly Call Methods on Interface Pointers in Go?

Kaedah Memanggil pada Penunjuk Antara Muka dalam Go

Dalam Go, apabila pengaturcaraan terhadap antara muka, anda mungkin menghadapi situasi di mana anda perlu dapat kaedah panggilan pada penunjuk kepada nilai antara muka. Ini boleh timbul dalam kes di mana anda ingin mengakses kaedah asas yang tidak didedahkan secara langsung oleh antara muka itu sendiri.

Pertimbangkan senario berikut:

package main

import "fmt"

// SqlExecutor interface
type SqlExecutor interface {
    Get(i interface{}, key interface{}) (interface{}, error)
}

// GorpDbMap and GorpTransaction implement SqlExecutor
type GorpDbMap struct{}
type GorpTransaction struct{}

func (db GorpDbMap) Get(i interface{}, key interface{}) (interface{}, error) {
    return nil, nil
}

func (tx GorpTransaction) Get(i interface{}, key interface{}) (interface{}, error) {
    return nil, nil
}

func main() {
    // Initialize a GorpDbMap or GorpTransaction
    dbMap := GorpDbMap{}
    transaction := GorpTransaction{}

    // Create a repository that uses the SqlExecutor interface
    repo := Repository{
        // This will result in an error
        Gorp: &dbMap,
    }

    // Try to call Get method on the pointer to the SqlExecutor interface
    obj, err := repo.GetById(1, 2)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(obj)
}

// Repository demonstrates calling methods on interface pointers
type Repository struct {
    Gorp SqlExecutor
}

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

Apabila menjalankan kod di atas, anda akan menghadapi ralat berikut:

r.Gorp.Get undefined (type *gorp.SqlExecutor has no field or method Get)

Ralat ini berlaku kerana penunjuk kepada nilai antara muka SqlExecutor tidak berfungsi dengan betul dinyahrujuk sebelum memanggil kaedah Dapatkan.

Untuk menyelesaikan isu ini, anda perlu menyahrujuk penuding kepada nilai antara muka dengan menggunakan pengendali asterisk (*). Ini boleh dicapai dengan mengubah suai kod seperti berikut:

func main() {
    // Initialize a GorpDbMap or GorpTransaction
    dbMap := GorpDbMap{}
    transaction := GorpTransaction{}

    // Create a repository that uses the SqlExecutor interface
    repo := Repository{
        Gorp: &dbMap,
    }

    // Try to call Get method on the pointer to the SqlExecutor interface
    obj, err := (*repo.Gorp).Get(1, 2)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(obj)
}

Dengan mendereferencing penuding kepada nilai antara muka, anda kini boleh mengakses kaedah asas struct yang melaksanakan antara muka. Dalam kes ini, kaedah Dapatkan struct GorpDbMap berjaya dipanggil.

Adalah penting untuk ambil perhatian bahawa dalam Go, biasanya disyorkan untuk memihak kepada menghantar nilai mengikut nilai berbanding menghantar penunjuk kepada nilai. Ini membantu mengelakkan pengubahsuaian yang tidak disengajakan kepada nilai asal. Dalam kes antara muka, anda biasanya harus menghantar nilai antara muka itu sendiri, bukannya penunjuk kepada nilai antara muka.

Atas ialah kandungan terperinci Bagaimana Cara 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