Heim >Backend-Entwicklung >Golang >Wie rufe ich Methoden für Schnittstellenzeiger in Go korrekt auf?

Wie rufe ich Methoden für Schnittstellenzeiger in Go korrekt auf?

DDD
DDDOriginal
2024-12-14 19:31:11205Durchsuche

How to Correctly Call Methods on Interface Pointers in Go?

Methoden auf Schnittstellenzeigern in Go aufrufen

In Go kann es beim Programmieren gegen Schnittstellen zu Situationen kommen, in denen Sie dazu in der Lage sein müssen Rufen Sie Methoden für einen Zeiger auf einen Schnittstellenwert auf. Dies kann in Fällen auftreten, in denen Sie auf zugrunde liegende Methoden zugreifen möchten, die nicht direkt von der Schnittstelle selbst verfügbar gemacht werden.

Stellen Sie sich das folgende Szenario vor:

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
}

Wenn Sie den obigen Code ausführen, werden Sie dies tun Es tritt der folgende Fehler auf:

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

Dieser Fehler tritt auf, weil der Zeiger auf den SqlExecutor-Schnittstellenwert vor dem Aufruf von Get nicht ordnungsgemäß dereferenziert wird Methode.

Um dieses Problem zu beheben, müssen Sie den Zeiger auf den Schnittstellenwert mithilfe des Sternchenoperators (*) dereferenzieren. Dies kann erreicht werden, indem der Code wie folgt geändert wird:

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

Durch die Dereferenzierung des Zeigers auf den Schnittstellenwert können Sie nun auf die zugrunde liegenden Methoden der Struktur zugreifen, die die Schnittstelle implementiert. In diesem Fall wird die Get-Methode der GorpDbMap-Struktur erfolgreich aufgerufen.

Es ist wichtig zu beachten, dass in Go im Allgemeinen empfohlen wird, die Übergabe von Werten nach Wert der Übergabe von Zeigern auf Werte vorzuziehen. Dies hilft, unbeabsichtigte Änderungen der ursprünglichen Werte zu verhindern. Im Fall von Schnittstellen sollten Sie normalerweise den Schnittstellenwert selbst und nicht einen Zeiger auf den Schnittstellenwert übergeben.

Das obige ist der detaillierte Inhalt vonWie rufe ich Methoden für Schnittstellenzeiger in Go korrekt auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn