1. ホーム
  2. arrays

[解決済み] Goでスライスをクリアするにはどうしたらいいですか?

2022-05-07 14:15:39

質問

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つは確かにそうです。

slice = slice[:0]

しかし、キャッチがある。スライス要素がT型である場合。

var slice []T

を実行すると len(slice) をゼロにするために、上記の"trick"を使用します。 はない の任意の要素を作成します。

slice[:cap(slice)]

ガベージコレクションの対象となります。これは、あるシナリオでは最適な方法かもしれません。しかし、それはまた、quot;メモリリーク(使用されていないメモリですが、'slice'の再スライスの後に)到達できる可能性があり、したがって、ガベージコレクション(ゴミ収集)可能ではない)の原因かもしれません。