Wie macht man eine Schnittstelle in Golang ungültig?

Susan Sarandon
Freigeben: 2024-11-01 21:11:02
Original
243 Leute haben es durchsucht

How do you nullify an interface in Golang?

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

Verwendung:

<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

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

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

Ausgabe:

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

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

Verwendung:

<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

Der Einfachheit halber wird jedoch empfohlen, Null direkt zuzuweisen, um einen Zeiger zu annullieren:

<code class="go">i = nil
typ = nil</code>
Nach dem Login kopieren

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!

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!