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

Go での追加の奇妙な動作

王林
王林転載
2024-02-02 14:13:261024ブラウズ

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 までご連絡ください。