為什麼reflect.MakeSlice返回不可尋址的值
在Go中,reflect包提供了一個接口來檢查和操作類型和值。 Reflect.MakeSlice 建立給定類型的切片。但是,傳回值是不可尋址的。這表示您無法取得其位址或將其指派給指標。
解決方案:使用reflect.New()
要使用反射來取得可尋址切片,您可以可以使用reflect.New()函數建立指向切片的指針。可以如下完成:
// Create the slice type sliceType := reflect.SliceOf(SomeType) // Create a slice using reflect.MakeSlice slice := reflect.MakeSlice(sliceType, 10, 10) // Create a pointer to the slice slicePtr := reflect.New(slice.Type()) // Set the slice pointer to the slice slicePtr.Elem().Set(slice)
現在,您有了一個可尋址切片,可以將其作為參數傳遞給需要切片指標的函數。
為什麼要反射。 MakeSlice 傳回不可尋址的值
Go 中的局部堆疊變數是不可尋址的,因為運行時可能隨時將它們移動到堆中。 Reflect.MakeSlice 建立一個本地切片變量,這就是為什麼傳回值不可尋址的原因。
為什麼需要指向切片的指標
一些 API,例如正如您在 mgo 套件中提到的那樣,需要一個指向切片的指標作為參數。這是因為當追加到切片時,可能會分配容量增加的新切片。如果傳遞非指標切片,則對切片所做的變更在函數外部將不可見。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3