Golang Methoden auf Interface-Zeiger aufrufen

7

Ich verwende Gorp für den Datenbankzugriff, Gorp hat einen Standard-Typ DbMap sowie einen Transaction -Typ wenn Sie zurückrollen möchten. Beide Typen implementieren die Schnittstelle SqlExecutor .

Ich programmiere daher gegen die SqlExecutor -Schnittstelle, damit ich Transaktionen verwenden kann, wenn ich möchte, ohne meinen Code ändern zu müssen.

Ich initialisiere dann ein Gorp DbMap oder Transaction und übergebe es als Feldeigenschaft. Das Problem ist, dass ich einen Zeiger auf das Gorp "-Objekt" brauche, sonst wie kann ich einen Rollback durchführen, wenn ich ein Transaction verwende, wenn das Gorp "-Objekt" durch einen Wert anstelle einer Referenz übergeben wird.

Ich bekomme dann eine Nachricht wie

%Vor%

wenn ich versuche, meinen Code zu verwenden. Wie rufe ich die Methoden auf?

Ein Codebeispiel ist unten.

%Vor%     
Lee 22.01.2014, 12:17
quelle

2 Antworten

13

Vielleicht überschätzen Sie das Problem oder Sie befinden sich immer noch unter einem "call by reference" -Einfluss von einer anderen Sprache:

  1. gorp.SqlExecutor ist eine Schnittstelle und Sie werden nie einen Zeiger auf einen Schnittstellenwert verwenden. Niemals. (Technisch ist das unwahr, aber wenn Sie tatsächlich einen Zeiger auf eine Schnittstelle benötigen, haben Sie Go genug gemeistert, um zu verstehen, warum "niemals" ein wirklich guter Rat ist.)
  2. Denken Sie niemals an "Anruf per Referenz". So etwas gibt es in Go nicht. Das Übergeben eines Zeigers an eine Funktion ist nicht "call by reference". Lass das hinter dir.

Ich nehme an, Sie haben nicht versucht, Transaktionen zu verwenden und Rollbacks für den Nicht-Zeiger-zu-Schnittstelle-Code auszuführen?

Hintergrund: In Go übergeben Sie einen Zeiger auf etwas aus zwei Gründen: 1) Sie wollen, weil Ihre Struktur wirklich groß ist und Sie vermeiden wollen, zu kopieren oder 2) Sie müssen, weil die Calee das Original ändern möchte (dies ist typisch für Methoden mit einem Zeigerempfänger). Jetzt ist ein Interface-Wert wirklich winzig (nur zwei Wörter), also gilt Grund 1, einen Zeiger auf einen Interface-Wert zu übergeben, nicht. Grund 2 trifft in den meisten Fällen nicht zu, da das Übergeben eines Zeigers an einen Schnittstellenwert das Ändern der -Schnittstelle -Wert selbst ermöglicht, aber meistens möchten Sie den Wert ändern innerhalb des Schnittstellenwerts gespeichert. Dieser innerhalb des Schnittstellenwerts gespeicherte Wert ist oft ein Zeigerwert, der es ermöglicht, den Wert einer Struktur zu ändern, indem Methoden auf einem Schnittstellenwert aufgerufen werden, der einen Zeiger auf diese Struktur enthält. Das hört sich kompliziert an, ist es aber nicht: Der Anfänger-Go-Programmierer verwendet einfach keine Zeiger auf Schnittstellen (da dies nichts bringt), und der erfahrene Go-Programmierer verwendet keine Zeiger auf Schnittstellen (da dies nicht viel bringt) gut), es sei denn, er muss einen Schnittstellenwert ändern, typischerweise während der Reflexion.

    
Volker 22.01.2014 12:33
quelle
9
  1. gorp.SqlExecutor ist eine Schnittstelle und Sie werden nie einen Zeiger verwenden zu einem Schnittstellenwert. Niemals.

  2. Wenn das Ihr Ziel ist, gehen Sie falsch vor. Ein Schnittstelle ist ein Wrapper und ein Vertrag, der das Verhalten garantiert. Ob Ihre Schnittstelle erfordert, dass die Methoden die Implementierung mutieren Typ, dann sollte der Implementierungstyp ein Zeiger sein. Ein Zeiger auf Die Schnittstelle selbst wird nicht plötzlich den Implementierungstyp machen veränderbar.

  3. Ihre Struktur sollte

    sein %Vor%
GoLang Master 30.05.2014 18:17
quelle

Tags und Links