私はGoで働いている次の機能を得ることができました。しかし、この関数が私に関数に渡す値の最初のバイトへのポインタを返すように、コードを最適化/一般化したい。現在のところ、[] uint32のみで動作しますが、他の多くの型(byte []、int []、stringなど)では、開始メモリアドレスを* byteとして取得したいと考えています。Golangの任意のデータ型の値にバイトポインタを取得する方法は?
ケースステートメントとして扱う必要があるすべてのタイプをキャッチするよりも、これを行うためのより一般的な方法がありますか?以下のコードのための
行く遊び場リンク: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)メソッドを呼び出す方法です。 このメソッドには、初期化されたメモリバッファが引数として渡されますが、* byteとして渡される必要があります。バッファは、時にはstring、uint32、[] byteなどで構成されています。私の意図は、基になるメモリブロックへのバイトポインタを与えるutil関数を作成することです。 – Neo
リフレクションを使用してください(例:reflect.SliceHeader) – thwd