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

Susan Sarandon
Freigeben: 2024-10-31 10:08:02
Original
137 Leute haben es durchsucht

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>
Nach dem Login kopieren

Beispiel:

<code class="go">var i interface{} = "Bob"
fmt.Printf("Before: %v\n", i)
setNilIf(&i)
fmt.Printf("After: %v\n", i)</code>
Nach dem Login kopieren

Ausgabe:

Before: Bob
After: <nil>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Ausgabe:

Before: &{filled}
After: <nil>
Nach dem Login kopieren
Nach dem Login kopieren

Reflexion verwenden:

<code class="go">func setNilPtr2(i interface{}) {
    v := reflect.ValueOf(i)
    v.Elem().Set(reflect.Zero(v.Elem().Type()))
}</code>
Nach dem Login kopieren

Beispiel:

<code class="go">typ2 := &TYP{InternalState: "filled"}
fmt.Printf("Before: %v\n", typ2)
setNilPtr2(&typ2)
fmt.Printf("After: %v\n", typ2)</code>
Nach dem Login kopieren

Ausgabe:

Before: &{filled}
After: <nil>
Nach dem Login kopieren
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!