Heim > Backend-Entwicklung > Golang > Warum erhalte ich die Fehlermeldung „Undefinierte Methode', wenn ich Methoden auf einem Schnittstellenzeiger in Go aufrufe?

Warum erhalte ich die Fehlermeldung „Undefinierte Methode', wenn ich Methoden auf einem Schnittstellenzeiger in Go aufrufe?

Susan Sarandon
Freigeben: 2024-12-14 14:33:15
Original
676 Leute haben es durchsucht

Why Do I Get an

Methoden für Schnittstellenzeiger in Golang aufrufen

Bei der Arbeit mit der Gorp-Bibliothek für den Datenbankzugriff stoßen Entwickler häufig auf die Notwendigkeit, Methoden aufzurufen einen Schnittstellenzeiger unter Beibehaltung der Möglichkeit, Transaktionen rückgängig zu machen. Dieses Problem ergibt sich aus der Anforderung, die Gorp DbMap- oder Transaktionsinstanz als Feldeigenschaft zu übergeben.

Das Problem

Wie im Beispielcode gezeigt, wird versucht, Methoden aufzurufen auf der SqlExecutor-Schnittstelle unter Verwendung einer Zeigerreferenz führt zu einem undefinierten Methodenfehler. Dies liegt daran, dass der Typ *gorp.SqlExecutor keine Get-Methode hat, während die gorp.SqlExecutor-Schnittstelle selbst eine hat.

Die Lösung

Das zugrunde liegende Missverständnis liegt darin die Annahme, dass die Übergabe eines Zeigers auf einen Schnittstellenwert das gleiche Verhalten liefert wie ein Aufruf per Referenz in anderen Sprachen. In Go werden Zeiger auf Schnittstellen aus zwei spezifischen Gründen verwendet:

  1. Um die Leistung bei der Übergabe großer Strukturwerte zu optimieren.
  2. Um es dem Aufgerufenen zu ermöglichen, den ursprünglichen Wert zu ändern (wenn die Methode hat einen Zeigerempfänger).

Keiner dieser Gründe gilt für Zeiger auf Schnittstellen, da Schnittstellenwerte bereits winzig sind und nicht über die Schnittstelle geändert werden können Wert selbst. Stattdessen ist es notwendig, den im Schnittstellenwert gespeicherten Wert zu ändern, der oft ein Zeiger auf eine tatsächliche Struktur ist.

Korrekte Implementierung

Um das Problem zu beheben, Der Code sollte die Übergabe eines Zeigers auf das Gorp-„Objekt“ vermeiden und stattdessen den Schnittstellenwert direkt übergeben. Der folgende Code implementiert diesen Ansatz korrekt:

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
}
Nach dem Login kopieren

Durch die Übergabe des Schnittstellenwerts als Wert und nicht als Referenz kann der Code die erforderliche Funktionalität beibehalten und gleichzeitig die ordnungsgemäße Verwendung von Zeigern in Go einhalten.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich die Fehlermeldung „Undefinierte Methode', wenn ich Methoden auf einem Schnittstellenzeiger in Go aufrufe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage