Go では、スライスの操作には、多くの場合、その内容の調整が含まれます。一般的な操作の 1 つは、スライス内のある位置から別の位置に要素を移動することです。ただし、単純なアプローチでは予期しない結果が生じる可能性があります。
要素を位置indexToRemoveからindexWhereToInsertに移動しようとする典型的な例を見てみましょう:
<code class="go">indexToRemove := 1 indexWhereToInsert := 4 slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} slice = append(slice[:indexToRemove], slice[indexToRemove+1:]...) fmt.Println("slice:", slice) newSlice := append(slice[:indexWhereToInsert], 1) fmt.Println("newSlice:", newSlice) slice = append(newSlice, slice[indexWhereToInsert:]...) fmt.Println("slice:", slice)</code>
このコードは次の出力を生成します。
slice: [0 2 3 4 5 6 7 8 9] newSlice: [0 2 3 4 1] slice: [0 2 3 4 1 1 6 7 8 9]
ただし、次の出力が期待されます:
slice: [0 2 3 4 5 6 7 8 9] newSlice: [0 2 3 4 1] slice: [0 2 3 4 1 5 6 7 8 9]
問題は、要素をシフトする方法から発生します。この例では、最初にindexToRemoveで要素を削除し、次にindexWhereToInsertで要素を挿入します。ただし、2 番目の操作では、indexWhereToInsert の後の要素のインデックスが変更されます。その結果、もともとindexWhereToInsertにあった要素が、削除された要素の後に挿入されます。
この問題に対処するために、要素内の要素を削除および挿入するためのカスタム関数を作成できます。スライス。これらの関数はインデックス調整を内部で処理します:
<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:]...) } 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("slice: ", slice) slice = insertInt(slice, 2, 5) fmt.Println("slice: ", slice) slice = removeInt(slice, 5) fmt.Println("slice: ", slice) slice = moveInt(slice, 1, 4) fmt.Println("slice: ", slice) }</code>
出力:
slice: [0 1 2 3 4 5 6 7 8 9] slice: [0 1 2 3 4 2 5 6 7 8 9] slice: [0 1 2 3 4 5 6 7 8 9] slice: [0 2 3 4 1 5 6 7 8 9]
以上がGo スライス内の要素を移動すると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。