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%Vielleicht überschätzen Sie das Problem oder Sie befinden sich immer noch unter einem "call by reference" -Einfluss von einer anderen Sprache:
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.) 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.
gorp.SqlExecutor
ist eine Schnittstelle und Sie werden nie einen Zeiger verwenden
zu einem Schnittstellenwert. Niemals.
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.
Ihre Struktur sollte
sein %Vor%Tags und Links go