How do you clear a slice in Go?

前端 未结 3 1089
死守一世寂寞
死守一世寂寞 2020-12-22 17:26

What is the appropriate way to clear a slice in Go?

Here\'s what I\'ve found in the go forums:

// test.go
package main

import (
    \"fmt\"
)

func          


        
3条回答
  •  执念已碎
    2020-12-22 17:45

    Setting the slice to nil is the best way to clear a slice. nil slices in go are perfectly well behaved and setting the slice to nil will release the underlying memory to the garbage collector.

    See playground

    package main
    
    import (
        "fmt"
    )
    
    func dump(letters []string) {
        fmt.Println("letters = ", letters)
        fmt.Println(cap(letters))
        fmt.Println(len(letters))
        for i := range letters {
            fmt.Println(i, letters[i])
        }
    }
    
    func main() {
        letters := []string{"a", "b", "c", "d"}
        dump(letters)
        // clear the slice
        letters = nil
        dump(letters)
        // add stuff back to it
        letters = append(letters, "e")
        dump(letters)
    }
    

    Prints

    letters =  [a b c d]
    4
    4
    0 a
    1 b
    2 c
    3 d
    letters =  []
    0
    0
    letters =  [e]
    1
    1
    0 e
    

    Note that slices can easily be aliased so that two slices point to the same underlying memory. The setting to nil will remove that aliasing.

    This method changes the capacity to zero though.

提交回复
热议问题