0

特定の値へのポインタをスライスに変換することは可能ですか?

たとえば、1 バイトio.Readeruint8変数に読み込みたいとします。io.Reader.Readは引数としてスライスを受け入れるため、C で行うように変数へのポインターを単純に提供することはできません。

ポインタから長さ1、容量1のスライスを作成するのは安全な操作だと思います。明らかに、これは長さ 1 の配列からスライスを作成することと同じである必要があり、これは許可された操作です。プレーン変数でこれを行う簡単な方法はありますか? それとも、私は何かを理解していないので、これが禁止されている理由がありますか?

4

3 に答える 3

2

スライスは、C の配列のようなポインターであるだけではありません。次のように、データの長さと容量も含まれています。

struct {
  ptr *uint8
  len int
  cap int
}

はい、スライスを作成する必要があります。のスライスを作成する最も簡単な方法はvar a uint8[]uint8{a}

a := uint8(42)
fmt.Printf("%#v\n", []uint8{a})

(しかし、あなたの質問を読み直した後、これはすべての解決策ではありません)

しかし、同じメモリ空間を指す変数からスライスを作成したい場合は、unsafeパッケージを使用できます。これは落胆する可能性が最も高いです。

fmt.Printf("%#v\n", (*[1]uint8)(unsafe.Pointer(&a))[:] )
于 2012-08-26T14:33:24.160 に答える
1

に変数を提供したいときに、自分のケースを克服する方法を見つけましたio.Reader。Go標準ライブラリは素晴らしい!

import (
    "io"
    "encoding/binary"
)

...

var x uint8
binary.Read(reader, LittleEndian, &x)

副次的な効果として、これはあらゆる基本型で機能し、一部の非基本型でも機能します。

于 2012-08-27T07:11:03.550 に答える
1

この些細な作業を (過度に) 複雑にする代わりに、単純な解決策を使用してみませんか? つまり、長さ 1 のスライスを .Read に渡し、その 0 番目の要素を変数に代入します。

于 2012-08-26T14:50:39.910 に答える