Heim >Backend-Entwicklung >Golang >Wie erstelle ich beim Umgang mit Zeigerreferenzen echte Kopien von Schnittstellenwerten in Go?

Wie erstelle ich beim Umgang mit Zeigerreferenzen echte Kopien von Schnittstellenwerten in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-07 09:40:15691Durchsuche

How to Create True Copies of Interface Values in Go When Dealing with Pointer References?

Kopieren versus Referenz in Schnittstellenwerten

In Go kann es vorkommen, dass Sie Kopien von Schnittstellenwerten erstellen müssen, um einen eindeutigen Status beizubehalten. Beim Kopieren von Schnittstellenwerten, die Zeigerverweise enthalten, ist es wichtig, die Auswirkungen zu berücksichtigen. In diesem Artikel wird untersucht, wie mit solchen Szenarien umgegangen wird, und es werden Techniken zum Erstellen echter Kopien bereitgestellt.

Das Problem: Werte durch Zeigerreferenzen teilen

Im angegebenen Beispiel verweist Benutzer1 über einen Zeiger auf eine Admin-Struktur. Das heißt, wenn Sie Benutzer1 Benutzer2 zuweisen, veranlassen Sie Benutzer2 im Wesentlichen, auf dieselbe zugrunde liegende Admin-Struktur zu verweisen. Alle über Benutzer1 oder Benutzer2 vorgenommenen Änderungen wirken sich auf die ursprüngliche Struktur aus.

Lösung 1: Explizites Kopieren der zugrunde liegenden Struktur

Ein Ansatz zum Erstellen eindeutiger Kopien besteht darin, den Wert in Benutzer1, Kopie, einzugeben die zugrunde liegende Admin-Struktur und verpacken Sie ihre Adresse in einen neuen Benutzerwert:

var user2 User
padmin := user1.(*Admin) // Obtain *Admin pointer
admin2 := *padmin        // Make a copy of the Admin struct
user2 = &admin2          // Wrap its address in another User

Lösung 2: Verwenden Reflexion

Für eine allgemeinere Lösung können Sie die Reflexionsfunktionen von Go nutzen, um den zugrunde liegenden Typ abzurufen, dynamisch einen neuen Wert dieses Typs zu erstellen und ihn in einen neuen Benutzerwert einzuschließen:

if reflect.TypeOf(user1).Kind() == reflect.Ptr {
    // Pointer:
    user3 = reflect.New(reflect.ValueOf(user1).Elem().Type()).Interface().(User)
} else {
    // Not pointer:
    user3 = reflect.New(reflect.TypeOf(user1)).Elem().Interface().(User)
}

Durch die Verwendung von Reflektion können Sie Fälle behandeln, in denen der Wert in Benutzer1 kein Zeiger ist.

Schlussfolgerung

In Fällen, in denen Schnittstellenwerte vorliegen kopiert werden und unverwechselbar bleiben müssen, ist es wichtig, den zugrunde liegenden Typ sorgfältig zu prüfen und geeignete Techniken wie explizites Kopieren oder Reflektieren zu verwenden, um echte Kopien zu erstellen. Mit diesen Ansätzen können Sie eine Kopie ändern, ohne das Original zu beeinträchtigen.

Das obige ist der detaillierte Inhalt vonWie erstelle ich beim Umgang mit Zeigerreferenzen echte Kopien von Schnittstellenwerten in Go?. 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