[解決済み] Goで2Dスライスを作成する簡潔な方法は何ですか?
質問
を見ながら、囲碁を勉強しています。
囲碁のツアー
. その中で、2Dのスライスを作成する課題がありました。
dy
の行と
dx
を含むカラム
uint8
. 私が現在行っている、うまくいく方法は、次のとおりです。
a:= make([][]uint8, dy) // initialize a slice of dy slices
for i:=0;i<dy;i++ {
a[i] = make([]uint8, dx) // initialize a slice of dx unit8 in each of dy slices
}
スライスを初期化するために、それぞれのスライスを反復するのは冗長すぎると思います。また、スライスの次元数が多くなると、コードが扱いにくくなります。Goで2D(またはn次元)スライスを初期化する簡潔な方法はないでしょうか?
どのように解決するのですか?
スライスは常に1次元ですが、より高い次元のオブジェクトを構築するために合成することができるからです。詳しくはこの質問をご覧ください。 Go: 2次元配列のメモリ表現はどうなっているのですか? .
その上で簡略化できることのひとつは
for range
という構文があります。
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
また、スライスの初期化で 複合リテラル の場合、例えば "free" ではこのようになります。
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
しかし、これにはいくつかのコツがあります。つまり、すべての値を列挙する必要はなく、その中の ゼロ値 スライスの要素タイプの これについての詳細は golangの配列初期化におけるキー項目 .
例えば、最初の10個の要素が0であるスライスが必要な場合、次のようになります。
1
と
2
というように作成することができます。
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
また、もしあなたが 配列 の代わりに スライス であれば、非常に簡単に作成することができます。
c := [5][5]uint8{}
fmt.Println(c)
出力は
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
配列の場合、配列は記述子ではなく値なので、配列の外側を繰り返し処理したり、配列の内側を初期化したりする必要はありません。ブログ記事参照 配列、スライス(と文字列)。append'の仕組み をご覧ください。
の例を試してみてください。 囲碁プレイグラウンド .
関連
-
[解決済み] golang の "go get" コマンドで "go: missing Git command" というエラーが表示される。
-
[解決済み] GolangパッケージがGOROOTにない(/usr/local/go/src/packageName) [閉じた]。
-
[解決済み] スライス表記を理解する
-
[解決済み] Javascriptで文字列の最後の文字を切り取るにはどうしたらいいですか?
-
[解決済み] JavaScriptで配列を複製する最速の方法 - スライス vs. 'for'ループ
-
[解決済み] Goでenumを表現する慣用的な方法は何ですか?
-
[解決済み] スライスのメソッドを含む
-
[解決済み】空のスライスを初期化する正しい方法
-
[解決済み】スライスの最後の要素を取得する方法は?
-
[解決済み] 文字列のスライスを1つの文字列に結合するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Goプロジェクトのビルド時に「XXXパッケージはGOROOTにありません」と表示される。
-
[解決済み] ParseFormはいつ使うべきで、FormValueとPostFormValueはいつ使うべきですか?
-
[解決済み] Goで構造体のフィールドを反復処理する
-
[解決済み] このキャスティングはgolangで行われているのでしょうか?
-
[解決済み] mod initは新しいフォルダを作成しますか? パスの意味は?
-
[解決済み] golangでnilはどういう意味ですか?
-
[解決済み] Goで2つのスライスを連結する
-
[解決済み] Goでオブジェクトの型を見つけるには?
-
[解決済み] コンソールで標準入力から読み込むにはどうすればよいですか?
-
[解決済み】Goでディレクトリを一覧表示する