2016-07-19 24 views
0

以下のコードを実行すると、インデックス作成がサポートされていないというコンパイラエラーが発生します。スライスポインタのインデックスがゴランで許可されていない理由

txs := make([]string, 2) 
txs[0] = "A" 

p := &txs 

fmt.Println(p[0]) 

スライスポインタのインデックスがサポートされていない理由を理解しようとしています。私は変数を変数にコピーしてインデックスを作成することができますが、なぜ言語がスライスポインタのインデックスをサポートしていないのか不思議です。そうするのがとても便利だろう。それとも私が気付いていないことをする方法はありますか?感想を聞かせてください。

+1

[スライスポインタを引数としてスライスする]関連する/可能な複製(http://stackoverflow.com/questions/38013922/slicing-a-slice-pointer-passed-as-argument) – icza

+0

またhttp: /stackoverflow.com/questions/28709254/how-to-access-elements-from-slice-using-index-which-is-passed-by-reference-in-go – JimB

+0

スライスポインタのインデックス付けは許可されていません。他のほとんどの演算子はポインタに対して有効ではありません。ポインタのタイプは、下にあるスライスとは別のタイプです。 – JimB

答えて

0

そこには抽象化があり、言語設計者はそれをポインタに適用しないことを選択しました。実用的な理由は、ポインタが配列の先頭を指していないという事実(メモリのブロックのようなものだからです)。索引付けに慣れているのなら、これは一般的にはstartingAddress + index * sizeof(dataType)のようなものです。したがって、値の型を持つ場合、発生する間接的なインダイレクションの層を隠す抽象化を既に提供しています。私は、スライダーオブジェクトへのポインターを持っているときに、実際のメモリにはかなり誤解を招くかもしれないという点を考えれば、言語作成者はこれを行うのが理にかなっているとは思わないと思います。それは既にある程度の混乱を招いていますが、多くの開発者にとって、この抽象化はまったく存在しません(たいていの場合、スライスと配列で操作する際には構文に顕著な違いがありません)。

関連する問題