Heim  >  Artikel  >  Backend-Entwicklung  >  So setzen Sie eine Schnittstelle in Golang auf Nil: Was ist der Unterschied zwischen Nil, einem Zeiger und einer Schnittstelle?

So setzen Sie eine Schnittstelle in Golang auf Nil: Was ist der Unterschied zwischen Nil, einem Zeiger und einer Schnittstelle?

Susan Sarandon
Susan SarandonOriginal
2024-10-31 10:08:02138Durchsuche

How to Set an Interface to Nil in Golang: What's the Difference Between Nil a Pointer and an Interface?

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!

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