これを見るのは少し奇妙ですが、ここでのほとんどの答えは危険であり、実際に何をしているのかを理解しています。スライスからアイテムを削除することについて尋ねられた元の質問を見ると、スライスのコピーが作成されてから、それが埋められています。これにより、スライスがプログラムに渡されるときに、微妙なバグが発生することがなくなります。
これは、このスレッドと元の投稿のユーザーの回答を比較するコードです。これは、でこのコードをいじくり回すための遊び場です。
追加ベースの削除
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
return append(s[:index], s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
上記の例では、スライスを作成し、0〜9の数字を手動で入力していることがわかります。次に、すべてからインデックス5を削除し、インデックスを削除するように割り当てます。しかし、今すべてを印刷しようとすると、それも変更されていることがわかります。これは、スライスが基になる配列へのポインタであるためです。それを書き出すremoveIndex
原因all
差ビーイングと同様に変更されることはall
なくなったから到達可能である一つの要素だけ長いですremoveIndex
。次に、の値を変更するremoveIndex
と、all
変更されることもわかります。効果的な実行は、これについてもう少し詳しく説明します。
次の例については説明しませんが、私たちの目的では同じことを行います。そして、コピーの使用も同じであることを示しています。
package main
import (
"fmt"
)
func RemoveCopy(slice []int, i int) []int {
copy(slice[i:], slice[i+1:])
return slice[:len(slice)-1]
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeCopy := RemoveCopy(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
removeCopy[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
}
質問の元の答え
元の質問を見ると、アイテムを削除するスライスは変更されません。このスレッドの元の回答を、このページにアクセスするほとんどの人にとってこれまでで最高のものにします。
package main
import (
"fmt"
)
func OriginalRemoveIndex(arr []int, pos int) []int {
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++
} else {
k++
}
i++
}
return new_arr
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
originalRemove := OriginalRemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
originalRemove[0] = 999
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
}
ご覧のとおり、この出力はほとんどの人が期待するとおりに機能し、おそらくほとんどの人が望んでいるものです。の変更は変更をoriginalRemove
引き起こさずall
、インデックスを削除して割り当てる操作も変更を引き起こしません!素晴らしい!
このコードは少し長いので、上記をこれに変更することができます。
正解
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
ret := make([]int, 0)
ret = append(ret, s[:index]...)
return append(ret, s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
元のインデックス削除ソリューションとほぼ同じですが、戻る前に追加する新しいスライスを作成します。