4

編集これは私の愚かなエラーによるものでしたが、他の誰かがこれを行った場合に備えて、質問は保持する価値があります.

これが機能することを願っています:

var xs []uint8
var x uint8
for x = range xs {

}

しかし、私はエラーが発生します:

cannot assign type int to x (type uint8) in range

つまり、(私が理解しているように) はrange、 のスライスで動作しているにもかかわらず、反復値としてuint8使用しようとしています。int

関連するビットである言語仕様を調べました。

Range expression                          1st value          2nd value (if 2nd variable is present)

array or slice  a  [n]E, *[n]E, or []E    index    i  int    a[i]       E

Eしたがって、「パラメータ化されたタイプ」*であると予想されますが、この場合uint8int.

スティックの間違った端をつかんでいませんか? 私が見逃したドキュメントが少しありますか?または、変数を使用してuint8スライスを反復処理することは本当にできませんか?uint8

*実際には、一般的なパラメーター化された型ではないことはわかっています。

4

1 に答える 1

6

rangeコレクションにインデックスを返し、場合によってはその位置の値を返します。

rangeキーワードrangeキーワードを使用すると、配列やマップなどのリストのアイテムを反復処理できます。それを理解するために、範囲キーワードをの各インデックスに変換できます。配列とスライスで使用すると、アイテムの整数インデックスを返します。(チュートリアル

サンプルコード:

package main

import "fmt"

func main() {
    var xs []uint8 = []uint8{255, 254, 253}
    var idx int
    var ui8 uint8
    for idx, ui8 = range xs {
        fmt.Println(idx, ui8)
    }
}

出力:

0 255
1 254
2 253

PS:

おそらく、Javascriptを見ると、Goのアプローチはそれほど奇妙ではなくなります。

% a = [255, 254, 253]
255,254,253
% for (x in a) { print(x, " ", a[x]); }
0 255
1 254
2 253
于 2013-01-06T15:00:30.630 に答える