Heim  >  Artikel  >  Backend-Entwicklung  >  Hier sind ein paar fragenbasierte Titel, die das Wesentliche Ihres Artikels zusammenfassen: * Wie setze ich in Golang eine Schnittstelle oder einen Zeiger auf Null? * Golang Nil-Aufgabe: Schnittstellen vs. Zeiger: Was ist das?

Hier sind ein paar fragenbasierte Titel, die das Wesentliche Ihres Artikels zusammenfassen: * Wie setze ich in Golang eine Schnittstelle oder einen Zeiger auf Null? * Golang Nil-Aufgabe: Schnittstellen vs. Zeiger: Was ist das?

Linda Hamilton
Linda HamiltonOriginal
2024-10-27 06:46:021007Durchsuche

Here are a few question-based titles that capture the essence of your article:

* How do I Set an Interface or Pointer to Nil in Golang? 
* Golang Nil Assignment: Interfaces vs. Pointers: What's the Difference?
* Zeroing Out in Golang: A Deep Dive into S

So setzen Sie eine Schnittstelle oder einen Zeiger in Golang auf Null

In Golang ist das Setzen eines Schnittstellenwerts auf Null möglicherweise nicht so einfach wie erwartet. In diesem Artikel wird erläutert, wie Schnittstellen und Zeiger in verschiedenen Szenarien auf Null gesetzt werden.

Eine Schnittstelle auf Null setzen

Beim Umgang mit einem Schnittstellenwert, insbesondere einer Schnittstelle, die gilt Wenn es sich um einen konkreten Typ handelt, besteht der richtige Ansatz darin, einen Zeiger auf die Schnittstelle zu übergeben und nicht den Schnittstellenwert selbst. Um eine Schnittstelle auf Null zu setzen, verwenden Sie eine Funktion, die einen Schnittstellenzeiger akzeptiert, wie zum Beispiel:

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

Beispiel:

<code class="go">var i interface{} = "Bob"
setNilIf(&i)
fmt.Println(i) // Prints <nil></code>

Einen Zeiger auf Null setzen

Das Deaktivieren eines Zeigerwerts erfordert etwas mehr Aufwand. Da Zeiger im Wesentlichen Speicheradressen sind, müssen wir den Zeiger dereferenzieren, um den Wert tatsächlich zu ändern. Dies führt zu einem Problem, da unsafe.Pointer nicht direkt dereferenziert werden kann. Um dieses Problem zu lösen, können wir die folgende Funktion verwenden:

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

Beispiel:

<code class="go">typ := &TYP{InternalState: "filled"}
fmt.Println(typ) // Prints &{filled}
setNilPtr(unsafe.Pointer(&typ))
fmt.Println(typ) // Prints <nil></code>

Hinweis: Der Einfachheit halber verwendet das Beispiel int as der Zieltyp für die Dereferenzierung. Als Ziel kann jeder Zeigertyp verwendet werden.

Alternativ können Sie Reflektion verwenden, um einen Zeiger auf Null zu setzen:

<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.Println(typ2) // Prints &{filled}
setNilPtr2(typ2)
fmt.Println(typ2) // Prints <nil></code>

Best Practice

Während die oben beschriebenen Techniken Möglichkeiten bieten, Schnittstellen und Zeiger auf Null zu setzen, ist es am besten, den idiomatischen Ansatz zu verwenden, der darin besteht, dem Wert einfach Null zuzuweisen. Zum Beispiel:

<code class="go">// Set interface to nil
i = nil

// Set pointer to nil
typ = nil</code>

Das obige ist der detaillierte Inhalt vonHier sind ein paar fragenbasierte Titel, die das Wesentliche Ihres Artikels zusammenfassen: * Wie setze ich in Golang eine Schnittstelle oder einen Zeiger auf Null? * Golang Nil-Aufgabe: Schnittstellen vs. Zeiger: Was ist das?. 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