2016-10-30 8 views
-3

私は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)) 
} 
+0

結果的にどのように '* byte 'が使われるかを定義せずにこの質問に本当に答えられるとは思いません。その明確な概念がないと、変換の有効なタイプは誰でしょうか?おそらく、['reflect.Value.Pointer'](https://golang.org/pkg/reflect/#Value.Pointer)の繰り返し定型文のいくつかを回避することができます – nothingmuch

+0

@nothingmuchこのように考えてください。 Goで作成できるすべての構造に開始メモリアドレスを取得できるようにしたい。これを比較してCのデータ型や構造体へのポインタを取得することができます。 実際にDeviceIoControl(Handle、uint32、* byte、uint32、* byte、uint32、* uint32、* Overlapped)メソッドを呼び出す方法です。 このメソッドには、初期化されたメモリバッファが引数として渡されますが、* byteとして渡される必要があります。バッファは、時にはstring、uint32、[] byteなどで構成されています。私の意図は、基になるメモリブロックへのバイトポインタを与えるutil関数を作成することです。 – Neo

+0

リフレクションを使用してください(例:reflect.SliceHeader) – thwd

答えて

0

Golangは、ジェネリックを持っていないので、私はあなたがすべての単一のタイプをキャッチする必要があると思います。

また、この例では、関数に渡される値の最初のバイトではなく、スライスの最初の要素の最初のバイトが取得されます。

0

おかげさまで、私が探していたものが見つかりました。 Goのリフレクションパッケージにちょっと掘り下げるだけでいいです。私は自分の質問に答えるだけで、他の人がこれを参考にしているかもしれません。ゴーのバイトポインタとしてメモリのいずれかに割り当てられたブロックの開始メモリアドレスを取得する

エレガントな1つのライナーは、次のようになります。

(*byte)(unsafe.Pointer(reflect.ValueOf(anyAllocatedDataGoesHere).Pointer())) 

誰もが、それは任意のデータ型のためにどのように動作するかをチェックする必要がある場合は、つまり、[] uint32、[] byte、string、int、struct、このサンプルPlayGroundを見てみましょう。 (ブラッド・フィッツのgroupcacheに使用されるような)

https://play.golang.org/p/G5fUOCfNCS

+1

あなたはある時点で型を知る必要があるでしょう、なぜインタフェースで型を隠し、ポインタを直接変換できる時に反映を使うのですか?(そして 'string 'が文字列構造体へのポインタになる点は何ですか?' [byte]はバッキング配列へのポインタになりますか? – JimB

0

は、アプリケーションが何であるかに応じて、ゴブのエンコードやいるProtobufを考えるかもしれません。あなたはあなたのデータのコピーを作っているだろうし、私はまだ十分に反映されていると確信していますが、少なくとも最適化されたコピーを得ています。&バイトエンコーディングです。これらのバイトがある種のコピーであると、アプリケーションの次のステップ。

関連する問題