Go でスライスをクリアする適切な方法は何ですか?
私が見つけたものは次のとおりですフォーラムに行く:
// test.go
package main
import (
"fmt"
)
func main() {
letters := []string{"a", "b", "c", "d"}
fmt.Println(cap(letters))
fmt.Println(len(letters))
// clear the slice
letters = letters[:0]
fmt.Println(cap(letters))
fmt.Println(len(letters))
}
これは正しいです?
明確に言えば、バッファは再利用できるようにクリアされます。
例えばバッファ.切り捨てバイト パッケージ内の関数。
Reset は Truncate(0) を呼び出すだけであることに注目してください。この場合、70 行目は次のように評価されるようです: b.buf = b.buf[0 : 0]
http://golang.org/src/pkg/bytes/buffer.go
// Truncate discards all but the first n unread bytes from the buffer.
60 // It panics if n is negative or greater than the length of the buffer.
61 func (b *Buffer) Truncate(n int) {
62 b.lastRead = opInvalid
63 switch {
64 case n < 0 || n > b.Len():
65 panic("bytes.Buffer: truncation out of range")
66 case n == 0:
67 // Reuse buffer space.
68 b.off = 0
69 }
70 b.buf = b.buf[0 : b.off+n]
71 }
72
73 // Reset resets the buffer so it has no content.
74 // b.Reset() is the same as b.Truncate(0).
75 func (b *Buffer) Reset() { b.Truncate(0) }
ベストアンサー1
スライスをクリアするには、スライスを に設定するのnil
が最善の方法です。Gonil
のスライスは完全に適切に動作し、スライスを に設定すると、nil
基礎となるメモリがガベージ コレクターに解放されます。
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)
}
プリント
letters = [a b c d]
4
4
0 a
1 b
2 c
3 d
letters = []
0
0
letters = [e]
1
1
0 e
スライスは簡単にエイリアス化できるため、2 つのスライスが同じ基礎メモリを指すことに注意してください。 に設定すると、nil
そのエイリアス化が削除されます。
ただし、この方法では容量がゼロに変わります。