Go でスライスを走査するには、要素の再配置が必要になることがよくあります。項目をある位置から別の位置に直接移動しようとすると、提供されたコード スニペットに示すように、予期しない結果が生じる可能性があります。
<code class="go">slice := []int{0,1,2,3,4,5,6,7,8,9} indexToRemove := 1 indexWhereToInsert := 4 slice = append(slice[:indexToRemove], slice[indexToRemove+1:]...) newSlice := append(slice[:indexWhereToInsert], 1) slice = append(newSlice, slice[indexWhereToInsert:]...)</code>
このアプローチでは、indexToRemove の項目をindexWhereToInsert に移動することを目的としていますが、出力は次のようになります。移動されたアイテムの 2 つのコピー。エラーは、項目の削除および挿入方法にあります。別のアプローチを検討してみましょう:
項目操作にカスタム関数を利用する
スライスを手動で変更する代わりに、挿入と削除のための専用関数を作成できます:
<code class="go">func insertInt(array []int, value int, index int) []int { return append(array[:index], append([]int{value}, array[index:]...)...) } func removeInt(array []int, index int) []int { return append(array[:index], array[index+1:]...) }</code>
アイテムを正確に移動
これらのヘルパー関数を使用すると、アイテムの移動が簡単になります:
<code class="go">func moveInt(array []int, srcIndex int, dstIndex int) []int { value := array[srcIndex] return insertInt(removeInt(array, srcIndex), value, dstIndex) }</code>
サンプルの実装と出力
<code class="go">func main() { slice := []int{0,1,2,3,4,5,6,7,8,9} fmt.Println("Original slice:", slice) slice = insertInt(slice, 2, 5) fmt.Println("After insertion:", slice) slice = removeInt(slice, 5) fmt.Println("After removal:", slice) slice = moveInt(slice, 1, 4) fmt.Println("After moving:", slice) }</code>
出力:
Original slice: [0 1 2 3 4 5 6 7 8 9] After insertion: [0 1 2 3 4 2 5 6 7 8 9] After removal: [0 1 2 3 4 5 6 7 8 9] After moving: [0 2 1 3 4 5 6 7 8 9]
このアプローチでは、インデックス 1 の項目がインデックス 4 に正しくシフトされ、期待どおりの出力が得られます。
以上が重複を作成せずに Go でスライス項目を移動するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。