Eine Schnittstelle in Golang auf Null setzen
In Golang repräsentiert ein Schnittstellenwert das Verhalten eines Objekts, ist aber nicht das eigentliche Objekt selbst. Wenn Sie versuchen, einen internen Wert einer Schnittstelle auf Null zu setzen, haben Sie es tatsächlich mit einem Zeiger auf einen konkreten Typ zu tun, der sich von einem Schnittstellenwert unterscheidet.
Eine Schnittstelle auf Null setzen
Wenn Sie eine Schnittstelle haben, deren Wert Sie auf Null setzen möchten, verwenden Sie die folgende Funktion:
<code class="go">func setNilIf(v *interface{}) { *v = nil }</code>
Beispiel:
<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>
Nil a Pointer
In Ihrem Fall haben Sie es mit einem Zeiger auf einen konkreten Typ zu tun. Um einen Zeiger zu löschen, können Sie Folgendes verwenden:
Verwenden von Unsafe.Pointer:
<code class="go">func setNilPtr(p unsafe.Pointer) { *(**int)(p) = nil }</code>
Beispiel:
<code class="go">type TYP struct { InternalState string } 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>
Reflexion verwenden:
<code class="go">func setNilPtr2(i interface{}) { v := reflect.ValueOf(i) v.Elem().Set(reflect.Zero(v.Elem().Type())) }</code>
Beispiel:
<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>
Hinweis:
Der Einfachheit halber wird im Allgemeinen empfohlen, der Zeigervariablen direkt Null zuzuweisen. anstatt komplexe Methoden wie die oben genannten zu verwenden.
Das obige ist der detaillierte Inhalt vonSo setzen Sie eine Schnittstelle in Golang auf Nil: Was ist der Unterschied zwischen Nil, einem Zeiger und einer Schnittstelle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!