在 Go 中,可尋址性是指能夠取得變數的記憶體位址並保證其有效性的能力。局部堆疊變數是不可尋址的,這個概念適用於使用reflect.MakeSlice建立的值。
使用reflect.MakeSlice時,您會建立一個新的切片值。然而,該值不會儲存在具有已知位址的儲存位置中。相反,它暫時存在於堆疊中。這個堆疊分配的值不能用於創建指向切片的指針,因為當堆疊幀被銷毀時,該位址將變得無效。
要解決此問題,請執行下列操作:取得可尋址的切片值,可以使用reflect.New()。此函數建立一個指向切片的指標:
myType := reflect.TypeOf(my) slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10) x := reflect.New(slice.Type()).Elem() x.Set(slice)
x.Elem() 呼叫取消引用指標並傳回實際的切片值,現在可用於傳遞給 All() 方法。
根據Go 語言規範,如果滿足以下條件,則值是可尋址的:
對於reflect.MakeSlice,新建立的slice 不滿足任何這些條件,因為它存在於堆疊上並且不儲存在永久記憶體位置中。
以上是為什麼使用「reflect.MakeSlice」建立的切片不可尋址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!