在Golang 中取消介面
問題:
嘗試取消的內部值要求了一個問題:如何實作這樣一個函式setNil(typ interface{})?
答案:
要有效地使介面失效,至關重要的是請記住,使用指標值與使用介面值不同。由於指標是透過引用傳遞的,因此必須傳遞指向介面的指標才能修改其內部狀態。
介面無效函數{}:
<code class="go">func setNilIf(v *interface{}) { *v = nil }</code>
用法:
<code class="go">var i interface{} = "Bob" fmt.Printf("Before: %v\n", i) setNilIf(&i) fmt.Printf("After: %v\n", i)</code>
輸出:
Before: Bob After: <nil>
輸出:
輸出:。 🎜>
<code class="go">func setNilPtr(p unsafe.Pointer) { *(**int)(p) = nil }</code>
要使指標無效,可以將其轉換為
unsafe.Pointer<code class="go">typ := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ) setNilPtr(unsafe.Pointer(&typ)) fmt.Printf("After: %v\n", typ)</code>
Before: &{filled} After: <nil>
用法:
輸出:
<code class="go">func setNilPtr2(i interface{}) { v := reflect.ValueOf(i) v.Elem().Set(reflect.Zero(v.Elem().Type())) }</code>
指針無效函數(>
<code class="go">typ2 := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ2) setNilPtr2(&typ2) fmt.Printf("After: %v\n", typ2)</code>
Before: &{filled} After: <nil>
以上是如何使 Golang 中的介面無效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!