スライスから削除する(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)])
}


参考サイト:
Go言語のスライスを理解しよう
Go のスライスの内部実装 - Block Rockin’ Codes