php小編柚子為您介紹如何從 nil 指標建立值。在程式設計中,nil 指標是指一個未指向任何有效記憶體位址的指標。通常情況下,我們無法從 nil 指標建立值,因為它不指向任何有效的記憶體空間。然而,有些程式語言提供了特殊的處理方式,讓我們可以從 nil 指標建立值。在這篇文章中,我們將討論這種特殊情況下的處理方法,以及如何避免潛在的問題和錯誤。無論您是初學者還是有經驗的開發者,本文都將為您提供有用的指導和建議。
在 Go 1.19 中,考慮以下定義:
type A struct{} type B struct{} type Field interface { *A | *B } type Person[T Field] struct { field T }
給定一個 nil Field
,我可以動態建立其底層值嗎?
func (p Person[T]) do() { if p.field == nil { // Can I make a value here that will be *A or *B dynamically depending on T? // Something that would be equivalent to new(A) or new(B) p.field = ? } }
func (p Person[T]) do() { if p.field == nil { // assuming T is a pointer type, e.g. *A pp := new(T) // initialize an instance of **A rt := reflect.TypeOf(pp) // get the reflect.Type representation of **A rt = rt.Elem() // get the reflect.Type representation of *A rt = rt.Elem() // get the reflect.Type representation of A rv := reflect.New(rt) // initialize reflect.Value representation of *A v := rv.Interface() // get the interface{}(*A) instance from reflect.Value t := v.(T) // type assert the interface's dynamic type p.field = t } }
https://www.php.cn/link/ccd2d123f4ec4d777fc6ef757d0fb642
#有關更多信息,請參閱文件:
reflect.TypeOf
取得指定值的類型資訊reflect.Type.Elem
取得類型的元素類型
reflect.New
傳回指向指定類型零值的指標
reflect.Value.Interface
傳回值作為介面{} v.(T)
類型斷言以上是如何從 nil 指標建立值的詳細內容。更多資訊請關注PHP中文網其他相關文章!