我已經設法在Go中獲得以下功能。但是我想優化/概括代碼,使得這個函數返回一個指向我傳遞給函數的任何值的第一個字節的指針。目前它只適用於[] uint32,但是我想用它來獲取許多其他類型(即byte [],int [],string等)的起始內存地址作爲*字節。如何獲取Golang中任何數據類型的值的字節指針?
是否有更通用的方法來做到這一點,而不是捕捉我需要解決的每種類型作爲case語句?
去遊樂場鏈接,下面的代碼:https://play.golang.org/p/KtNTbERQGa
package main
import (
"fmt"
"reflect"
"unsafe"
)
func ToBytePointer(data interface{}) *byte {
fmt.Println("Received type is", reflect.TypeOf(data))
switch data.(type) {
case []uint32:
typedData := data.([]uint32)
return (*byte)(unsafe.Pointer(&typedData[0]))
default:
return nil
}
}
func main() {
var data = []uint32{1, 2, 3}
var dataBytePointer = (*byte)(unsafe.Pointer(&data[0]))
fmt.Println(dataBytePointer, ToBytePointer(data))
}
我不認爲這個問題真的可以在沒有定義如何使用'* byte'的情況下得到回答。沒有一個清晰的概念,誰來說什麼是有效的轉換類型?你可以使用['reflect.Value.Pointer'](https://golang.org/pkg/reflect/#Value.Pointer)來解決一些重複的樣板問題。 – nothingmuch
@nothingmuch想想這樣。我希望能夠將起始內存地址獲取到我可以在Go中創建的任何結構。您可以將它與獲取指向C中任何數據類型或結構的指針進行比較。我真正的用法是調用DeviceIoControl方法(Handle,uint32,* byte,uint32,* byte,uint32,* uint32,* Overlapped)。 該方法需要預先初始化的內存緩衝區作爲參數傳遞給它,但是作爲*字節。緩衝區有時由字符串,uint32,[]字節等組成。所以我的目的是創建一個util函數,它給我指向任何底層內存塊的字節指針。 – Neo
使用反射(例如參見reflect.SliceHeader) – thwd