ホームページ > バックエンド開発 > Golang > Go での追加の奇妙な動作

Go での追加の奇妙な動作

王林
リリース: 2024-02-02 14:13:26
転載
1047 人が閲覧しました

Go 中追加的奇怪行为

質問内容

LeetCodeのサブセット化問題をGoを使って解こうとしています。次の解決策を思いつきました:

リーリー

ただし、この解決策は正しくありません。 sol=append(sol,temp) だけではなく、append(sol,append([]int{},temp...)) を使用する必要があることに気付きました。

fmt.Println(temp,append([]int{}, temp...)) ステートメントは temp と append([]int{}, temp...) に対して同じ出力を生成しますが、append を使用してください([ ]int{}, temp... の修正版) は実際に動作します。この場合の temp と append([]int{}, temp...) の違いを誰かが説明できますか?修正バージョンは動作するのに、初期バージョンは動作しないのはなぜですか?

Expectedtempappend([]int{},temp...) と同じです


#正解


##sol =append(sol, temp)

問題は、項目「内部」の代わりにスライス tempsol に追加していることです。スライス。 スライス内部ブログ投稿で述べたように、スライスは配列、その長さと容量への「単なる」ポインターです。 したがって、あなたの場合、

temp

は繰り返しごとに 再利用されるため、temp スライスの下の配列の内容は上書きされ、値は以前に sol に追加したスライス内のものも、変更されたものとして上書きされます (スライスの下の配列が変更されているため)。これが、正しい値を含む temp を追加する前に fmt.Println ステートメントが表示されているにもかかわらず、間違った結果が得られる理由です。 append([]int{}, temp...)

が新しいスライスを作成する場合、新しいスライス内の値は再利用されないため変更できません。

以上がGo での追加の奇妙な動作の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート