Heim > Artikel > Backend-Entwicklung > Wie macht man eine Schnittstelle in Golang ungültig?
Annullierung einer Schnittstelle in Golang
Problem:
Versuch, einen internen Wert von zu annullieren Eine Schnittstelle wirft die Frage auf: Wie implementiert man eine solche Funktion, setNil(typ interface{})?
Antwort:
Um eine Schnittstelle effektiv zu nullen, ist es von entscheidender Bedeutung Denken Sie daran, dass sich die Arbeit mit einem Zeigerwert von der Arbeit mit einem Schnittstellenwert unterscheidet. Da Zeiger als Referenz übergeben werden, muss ein Zeiger auf die Schnittstelle übergeben werden, um ihren internen Zustand zu ändern.
Funktion zur Nullifizierung der Schnittstelle{}:
<code class="go">func setNilIf(v *interface{}) { *v = nil }</code>
Verwendung:
<code class="go">var i interface{} = "Bob" fmt.Printf("Before: %v\n", i) setNilIf(&i) fmt.Printf("After: %v\n", i)</code>
Ausgabe:
Before: Bob After: <nil>
Funktion zur Nullifizierung von Zeigern (Unsafe.Pointer):
Um einen Zeiger zu annullieren, kann er in einen unsafe.Pointer konvertiert und dereferenziert werden:
<code class="go">func setNilPtr(p unsafe.Pointer) { *(**int)(p) = nil }</code>
Verwendung:
<code class="go">typ := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ) setNilPtr(unsafe.Pointer(&typ)) fmt.Printf("After: %v\n", typ)</code>
Ausgabe:
Before: &{filled} After: <nil>
Funktion zur Nullifizierung von Zeigern (Reflexion):
Schließlich kann Reflexion auch zur Nullifizierung eines Zeigers verwendet werden:
<code class="go">func setNilPtr2(i interface{}) { v := reflect.ValueOf(i) v.Elem().Set(reflect.Zero(v.Elem().Type())) }</code>
Verwendung:
<code class="go">typ2 := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ2) setNilPtr2(&typ2) fmt.Printf("After: %v\n", typ2)</code>
Ausgabe:
Before: &{filled} After: <nil>
Der Einfachheit halber wird jedoch empfohlen, Null direkt zuzuweisen, um einen Zeiger zu annullieren:
<code class="go">i = nil typ = nil</code>
Das obige ist der detaillierte Inhalt vonWie macht man eine Schnittstelle in Golang ungültig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!