Goでスライスをクリアするにはどうすればいいですか? 質問する

Goでスライスをクリアするにはどうすればいいですか? 質問する

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そのエイリアス化が削除されます。

ただし、この方法では容量がゼロに変わります。

おすすめ記事