回答

收藏

你如何清除 Go 中的切片?

技术问答 技术问答 269 人阅读 | 0 人回复 | 2023-09-12

在 Go 去除切片的合适方法是什么?. ^) v' c7 d; \$ y3 {. ?
这是我发现的:  W2 Z# W# {8 v- F$ W& ?6 {- `
    // test.gopackage mainimport  "fmt")func main()      letters := []string{"a","b","c","d"}    fmt.Println(cap(letters))    fmt.Println(len(letters))    // clear the slice    letters = letters   fmt.Println(cap(letters))    fmt.Println(len(letters))}
    $ Y( L* r* T+ g) c9 r. g( j
这样对吗?1 C0 o0 i1 K2 H! t* j" }
澄清一下,缓冲区已经以便重用。
1 D! z6 a9 C6 u! W' s/ Q. V2 V一个例子是bytes 包中的Buffer.Truncate函数。
7 }* Z' G$ M/ N: R! j. L请注意,Reset 只是调用了 Truncate(0)。因此,在这种情况下,似乎会评估第 70 行: b.buf = b.buf[0 : 0]
/ T- [' a) m( ]3 N+ X1 S) c: Thttp://golang.org/src/pkg/bytes/buffer.go$ p8 @9 n& I5 e# j7 n2 O

    6 d* q7 u* F6 U) F
  • // 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)        b.lastRead = opInvalid63        switch        case n  b.Len():65       panic("bytes.Buffer: truncation out of range")66       case n ==         Reuse buffer space.688               b.off =        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) code]               * V6 R+ r. S& j
  •     解决方案:                                                               
    : r3 A$ i; y# P8 _; h$ y
  •                                                                 这一切都取决于你对清晰的定义。当然,其中一个有效的是:[code]slice = slice[:0]. C6 J  f1 m' a( Y$ m) q
但是有一个问题。如果切片元素的类型是 T:
1 w- k" K6 }7 m4 e# R2 ~% f
    var slice []T# w; }, v* T% H0 `/ t+ G% S' D
然后强制len(slice)以上技巧为零,不会使任何元素
" [  B. }: @7 A! {  {
    slice[:cap(slice)]( r0 c7 V" {3 ~$ Z
满足垃圾收集条件。在某些情况下,这可能是最好的方法。但这也可能是内存泄漏的原因- 内存未使用,但可访问(重新切片后),因此不能收集垃圾。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则