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!