fmt.Println("Enter position to delete::")
fmt.Scanln(&pos)
new_arr := make([]int, (len(arr) - 1))
k := 0
for i := 0; i < (len(arr) - 1); {
if i != pos {
new_arr[i] = arr[k]
k++
i++
} else {
k++
}
}
for i := 0; i < (len(arr) - 1); i++ {
fmt.Println(new_arr[i])
}
このコマンドを使用してスライスから要素を削除していますが、機能しません。ご提案をお願いします。
ベストアンサー1
順序は重要
配列の順序を維持したい場合は、削除インデックスの右側にあるすべての要素を 1 つ左にシフトする必要があります。これは、Golang では簡単に実行できます。
func remove(slice []int, s int) []int {
return append(slice[:s], slice[s+1:]...)
}
ただし、すべての要素を移動することになり、コストがかかる可能性があるため、これは非効率的です。
順序は重要ではない
順序を気にしない場合は、削除する要素をスライスの末尾の要素に置き換えてから、最初の n-1 個の要素を返す方がはるかに高速です。
func remove(s []int, i int) []int {
s[i] = s[len(s)-1]
return s[:len(s)-1]
}
再スライス方式では、1,000,000 要素の配列を空にするのに 224 秒かかりますが、この方法では 0.06 ナノ秒しかかかりません。
この回答では境界チェックは実行されません。入力として有効なインデックスが必要です。つまり、負の値または初期値以上のインデックスはlen(s)
Go をパニックに陥れることになります。
スライスと配列は 0 からインデックス付けされるため、配列の n 番目の要素を削除するには、入力n-1を指定することになります。最初の要素を削除するには、remove(s, 0)を呼び出し、2 番目の要素を削除するには、remove(s, 1)を呼び出します。以下同様に続きます。