Eine Schnittstelle in Go auf Null setzen
In Go bieten Schnittstellen eine Möglichkeit, eine Reihe von Methoden zu definieren, die ein Typ implementieren muss. Sie ermöglichen Polymorphismus, sodass verschiedene Typen einheitlich behandelt werden können. Allerdings kann es schwierig sein, eine Schnittstelle direkt auf Null zu setzen.
Das Problem von Zeigerwerten vs. Schnittstellenwerten
Beim Versuch, eine Schnittstelle auf Null zu setzen, ist die Herausforderung entsteht, weil Schnittstellen keine tatsächlichen Werte enthalten, sondern auf Werte konkreter Typen verweisen. Um den Wert einer Schnittstelle zu ändern, müssen Sie daher einen Zeiger darauf übergeben.
Lösung 1: Kein Interface{}-Wert
Wenn Sie möchten nil ein Interface{}-Wert ist, ist eine Funktion wie diese erforderlich:
<code class="go">func setNilIf(v *interface{}) { *v = nil }</code>
Um sie zu verwenden:
<code class="go">var i interface{} = "Bob" fmt.Printf("Before: %v\n", i) setNilIf(&i) fmt.Printf("After: %v\n", i)</code>
Lösung 2: Null einen Zeiger mit unsafe.Pointer
Für Zeiger, was häufig der Fall ist, wenn Schnittstellen auf Null gesetzt werden, können Sie unsafe.Pointer verwenden, mit dem Sie jeden Zeiger in den Typ **unsafe.Pointer und zurück konvertieren können. Dies bietet eine Möglichkeit, den Zeiger zu dereferenzieren und Null zuzuweisen:
<code class="go">func setNilPtr(p unsafe.Pointer) { *(**int)(p) = nil }</code>
Um es zu verwenden:
<code class="go">typ := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ) setNilPtr(unsafe.Pointer(&typ)) fmt.Printf("After: %v\n", typ)</code>
Lösung 3: Null eines Zeigers mithilfe von Reflection
Ein alternativer Ansatz zum Nullen von Hinweisen beinhaltet die Verwendung von Reflexion:
<code class="go">func setNilPtr2(i interface{}) { v := reflect.ValueOf(i) v.Elem().Set(reflect.Zero(v.Elem().Type())) }</code>
Um es zu verwenden:
<code class="go">typ2 := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ2) setNilPtr2(&typ2) fmt.Printf("After: %v\n", typ2)</code>
Empfehlung für Einfachheit
Trotz der verschiedenen vorgestellten Lösungen bleibt der empfohlene Ansatz, dem Wert direkt Null zuzuweisen:
<code class="go">i = nil typ = nil</code>
Dieser Ansatz ist unkompliziert und vermeidet unnötige Komplexität.
Das obige ist der detaillierte Inhalt vonWie setze ich eine Schnittstelle in Go auf „Nil': Ein Leitfaden zum Verständnis und zu Best Practices?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!