[解決済み] 反復しながら値を変更する
2022-04-20 05:54:33
質問
このような型があるとします。
type Attribute struct {
Key, Val string
}
type Node struct {
Attr []Attribute
}
で、自分のノードの属性を繰り返し変更したいとします。
できるようになるといいなと思いました。
for _, attr := range n.Attr {
if attr.Key == "href" {
attr.Val = "something"
}
}
としていますが
attr
はポインターではないので、これはうまくいかないので、そうしなければならない。
for i, attr := range n.Attr {
if attr.Key == "href" {
n.Attr[i].Val = "something"
}
}
もっと簡単な方法、もっと速い方法はないでしょうか?からのポインタを直接取得することは可能でしょうか?
range
?
もちろん、反復のためだけに構造を変えたくはありませんし、より冗長な解決策は解決策ではありません。
どのように解決するのですか?
いいえ、ご希望の省略形はできません。
その理由は、以下の通りです。
range
は、反復処理中のスライスから値をコピーします。
そのため
範囲についての指定
と書かれています。
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
そこで、レンジは
a[i]
を配列/スライスの2つ目の値として使用することを意味します。
の値がコピーされ、元の値には手を付けられなくなります。
この挙動を示すのが 次のコード :
x := make([]int, 3)
x[0], x[1], x[2] = 1, 2, 3
for i, val := range x {
println(&x[i], "vs.", &val)
}
このコードでは、範囲指定された値と実際の値で、まったく異なるメモリ位置が表示されます。 の値をスライスします。
0xf84000f010 vs. 0x7f095ed0bf68
0xf84000f014 vs. 0x7f095ed0bf68
0xf84000f018 vs. 0x7f095ed0bf68
ということは、すでにjnmlさんやpeterSOさんが提案されているように、ポインターを使うかインデックスを使うかしかないわけです。
関連
-
[解決済み] JavaScriptの配列で一意な値をすべて取得する(重複を排除する)。
-
[解決済み] JavaScriptの配列宣言で「Array()」と「[]」はどう違うのですか?
-
[解決済み] ディレクトリ内のファイルをループしてパスを変更し、ファイル名にサフィックスを追加する方法
-
[解決済み] なぜpythonはforやwhileループの後に'else'を使うのですか?
-
[解決済み] C#の配列に値を追加する
-
[解決済み] Swift カスタムオブジェクトの配列をプロパティ値でソートする方法
-
[解決済み] パラメータと戻り値におけるポインタと値の比較
-
[解決済み] マップの全キーに対する反復処理
-
[解決済み】オブジェクトの配列をプロパティ値でソートする
-
[解決済み] Goでスライスをクリアするにはどうしたらいいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
ArrayIndexOutOfBoundsExceptionが発生しました。7Exception: at Test.m)
-
[解決済み] Swiftでリストアイテムのインデックスを見つける方法は?
-
[解決済み] Bashで配列の要素を結合するには?
-
[解決済み】Bashでコマンドライン引数を配列に変換する。
-
[解決済み] 配列からランダムに要素を選ぶ
-
[解決済み] Goでスライスをクリアするにはどうしたらいいですか?
-
[解決済み] 行列を1次元の配列に変換する。
-
[解決済み] groovyの配列/ハッシュ/コレクション/リストに要素があるかどうかをチェックするには?
-
[解決済み] HttpPostedFileBaseをbyte[]に変換する。
-
[解決済み] SwiftのJSONDecodeで配列のデコードに失敗する(単一要素のデコードに失敗した場合