Heim > Backend-Entwicklung > Golang > Wie setze ich eine Schnittstelle in Go auf „Nil': Ein Leitfaden zum Verständnis und zu Best Practices?

Wie setze ich eine Schnittstelle in Go auf „Nil': Ein Leitfaden zum Verständnis und zu Best Practices?

Patricia Arquette
Freigeben: 2024-10-28 20:50:02
Original
806 Leute haben es durchsucht

How to Set an Interface to Nil in Go: A Guide to Understanding and Best Practices?

Eine Schnittstelle in Go auf Null setzen

In Go bieten Schnittstellen eine Möglichkeit, eine Reihe von Methoden zu definieren, die ein Typ implementieren muss. Sie ermöglichen Polymorphismus, sodass verschiedene Typen einheitlich behandelt werden können. Allerdings kann es schwierig sein, eine Schnittstelle direkt auf Null zu setzen.

Das Problem von Zeigerwerten vs. Schnittstellenwerten

Beim Versuch, eine Schnittstelle auf Null zu setzen, ist die Herausforderung entsteht, weil Schnittstellen keine tatsächlichen Werte enthalten, sondern auf Werte konkreter Typen verweisen. Um den Wert einer Schnittstelle zu ändern, müssen Sie daher einen Zeiger darauf übergeben.

Lösung 1: Kein Interface{}-Wert

Wenn Sie möchten nil ein Interface{}-Wert ist, ist eine Funktion wie diese erforderlich:

<code class="go">func setNilIf(v *interface{}) {
    *v = nil
}</code>
Nach dem Login kopieren

Um sie zu verwenden:

<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

Lösung 2: Null einen Zeiger mit unsafe.Pointer

Für Zeiger, was häufig der Fall ist, wenn Schnittstellen auf Null gesetzt werden, können Sie unsafe.Pointer verwenden, mit dem Sie jeden Zeiger in den Typ **unsafe.Pointer und zurück konvertieren können. Dies bietet eine Möglichkeit, den Zeiger zu dereferenzieren und Null zuzuweisen:

<code class="go">func setNilPtr(p unsafe.Pointer) {
    *(**int)(p) = nil
}</code>
Nach dem Login kopieren

Um es zu verwenden:

<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

Lösung 3: Null eines Zeigers mithilfe von Reflection

Ein alternativer Ansatz zum Nullen von Hinweisen beinhaltet die Verwendung von Reflexion:

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

Um es zu verwenden:

<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

Empfehlung für Einfachheit

Trotz der verschiedenen vorgestellten Lösungen bleibt der empfohlene Ansatz, dem Wert direkt Null zuzuweisen:

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

Dieser Ansatz ist unkompliziert und vermeidet unnötige Komplexität.

Das obige ist der detaillierte Inhalt vonWie setze ich eine Schnittstelle in Go auf „Nil': Ein Leitfaden zum Verständnis und zu Best Practices?. 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