首頁 > 後端開發 > Golang > 如何使 Golang 中的介面無效?

如何使 Golang 中的介面無效?

Susan Sarandon
發布: 2024-11-01 21:11:02
原創
388 人瀏覽過

How do you nullify an interface in Golang?

在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):

要使指標無效,可以將其轉換為

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>
登入後複製
登入後複製
但是,為了簡單起見,建議直接賦值nil 來使指標無效:

以上是如何使 Golang 中的介面無效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板