Heim >Backend-Entwicklung >Golang >Warum sollte ich beim Aufrufen von Methoden in Go die Verwendung von Zeigern auf Schnittstellenwerte vermeiden?

Warum sollte ich beim Aufrufen von Methoden in Go die Verwendung von Zeigern auf Schnittstellenwerte vermeiden?

DDD
DDDOriginal
2024-12-07 05:15:16435Durchsuche

Why Should I Avoid Using Pointers to Interface Values When Calling Methods in Go?

Aufrufen von Methoden für Schnittstellenzeiger in Go

In Go müssen Sie möglicherweise für eine Schnittstelle programmieren und Transaktionen verwenden, ohne Ihre Schnittstelle zu ändern Code. Ein gängiger Ansatz besteht darin, einen Zeiger auf ein „Objekt“ in eine Feldeigenschaft zu übergeben, um bei Bedarf Rollbacks zu ermöglichen. Dieser Ansatz kann jedoch zu Verwirrung führen.

Betrachten wir ein Codebeispiel:

package repositories

import (
    "github.com/coopernurse/gorp"
)

type Repository struct {
    Gorp *gorp.SqlExecutor // Pointer to SqlExecutor
}

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

Hier könnten Sie glauben, dass Sie einen Zeiger auf das Gorp-„Objekt“ benötigen, um Rollbacks durchzuführen. Es ist jedoch wichtig, einige Schlüsselkonzepte in Go zu verstehen:

  • Zeiger auf Schnittstellen: Sie werden in Go niemals einen Zeiger auf einen Schnittstellenwert verwenden. Schnittstellen sind abstrahierte Werttypen.
  • Call by Value: In Go werden alle Funktionsargumente als Wert übergeben. Dazu gehören Zeiger.
  • Werte ändern: Wenn Sie einen Zeiger auf eine Struktur oder einen anderen Typ übergeben, können Sie den ursprünglichen Wert ändern. Dies ist jedoch bei Zeigern auf Schnittstellen nicht der Fall.

Im Beispielcode können Sie, obwohl Sie einen Zeiger auf den Gorp SqlExecutor haben, keine Methoden auf dem Schnittstellenzeiger selbst aufrufen. Stattdessen rufen Sie Methoden für den zugrunde liegenden Wert auf. In diesem Fall ist der zugrunde liegende Wert eine SqlExecutor-Struktur.

Daher können Sie den Zeiger sicher aus der Repository-Struktur entfernen und einfach die SqlExecutor-Schnittstelle an das Repository übergeben:

package repositories

import (
    "github.com/coopernurse/gorp"
)

type Repository struct {
    Gorp gorp.SqlExecutor // Pointer removed
}

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

Dies Der Code funktioniert wie erwartet und ermöglicht Ihnen die Verwendung von Transaktionen, ohne den zugrunde liegenden SqlExecutor zu ändern. Sie müssen sich in diesem Zusammenhang keine Gedanken über die Übergabe von Zeigern auf Schnittstellen machen.

Das obige ist der detaillierte Inhalt vonWarum sollte ich beim Aufrufen von Methoden in Go die Verwendung von Zeigern auf Schnittstellenwerte vermeiden?. 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