スライスから削除する(deleteみたいな関数はない)
deleteみたいな関数はないようなので自分で書きましょう。
ダメな例
func delete(s []int, i int) []int { s = append(s[:i], s[i+1:]...) return s } func main() { s := []int{1, 2, 3, 4, 5} s = delete(s, 2) //slice:[1 2 4 5], len:4, cap:5 fmt.Printf("slice:%d, len:%d, cap:%d\n", s, len(s), cap(s)) //s == [1 2 4 5 5] fmt.Println(s[:cap(s)]) }
このままだと見た目は削除できているように見えるんですけど、容量が削除されていないため不要な値が残っているようです。
なので、容量まで削除しましょう。
良い例
func delete(s []int, i int) []int { s = append(s[:i], s[i+1:]...) //新しいスライスを用意することがポイント n := make([]int, len(s)) copy(n, s) return n } func main() { s := []int{1, 2, 3, 4, 5} s = delete(s, 2) //slice:[1 2 4 5], len:4, cap:4 fmt.Printf("slice:%d, len:%d, cap:%d\n", s, len(s), cap(s)) //s == [1 2 4 5] fmt.Println(s[:cap(s)]) }