美文网首页
GO中的切片

GO中的切片

作者: 暂且听风吟一曲 | 来源:发表于2016-12-26 22:17 被阅读0次

Refs

原文:Go Slices: usage and internals

The Go Programming Language Specification

Effect GO

Array

Go中的数组对象代表着整个数组,而是指向首元素的指针。当传递数组对象时,传递的是整个数组的值。

b := [...]string{"a", "b", "c"}

Slices

Slices的声明与Array类似,但是省略了长度信息。

l := []string{"a", "b", "c"}

或者使用内置的make方法

l = make([]string, len, cap)

Array和Slices的切片操作会产生Slices对象

Slices实现原理
  • make([]byte, 5)会产生下图中的结构:

  • s = s[2:4]后cap会剔除前方的长度(5 - 2 = 3):

  • 切片操作没有拷贝Slice的数据,而是创建了左侧的结构并把指针指向起始位置。因此,操作切片结果是,会影响到原有的数据;

  • s = s[:cap(s)]来使用全部空间;

COPY

增加slice容量只能通过分配新的slice空间、拷贝数据来实现。

s := [3]byte{'a', 'b', 'c'}
t := make([]byte, len(s), (cap(s) + 1) * 2)
copy(t, s)
s = t
APPEND
func AppendByte(slice []byte, data ... byte) []byte {
  m := len(slice)
  n := m + len(data)
  if n > cap(slice) {
    newSlice := make([]byte, (n + 1) * 2)
    copy(newSlice, slice)
    slice = newSlice
  }
  slice = slice[0:n]      // len == cap
  copy(slice[m:n], data)
  return slice
}
  • 添加元素
p := []byte{2, 3, 5}
p = p.append(p, 1, 2)
  • 添加slice
a := []string{"a", "b", "c"}
b := []string{"e", "f", "g"}
b = append(a, b...)
func Filter(s []int, fn func(int) bool) [] int {
  var p []int   // nil
  for _, v := range s {
    if fn(v) {
      p = append(p, v)
    }
  }
  return p
}
疑思

当只需要大量数据的一小部分时,如果对大量数据做切片操作,那么这些数据都会保留在内存中。例如,读取文件中数据并返回特定片断的程序。
这种情况下,建议构造目标数据的切片进行返回,这样GC就能够及时回收无用的数据。

相关文章

  • Go语言切片

    // //Go语言切片 // /* // go语言切片是对数组的抽象 // Go 数组的长度不可改变,在特定场景中...

  • 七、Go切片

    七、Go语言切片(Slice) Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就...

  • GO中的切片

    Refs 原文:Go Slices: usage and internals The Go Programming...

  • Golang string

    Go中的字符串是字节的切片

  • Go中的切片append

  • Golang之数组和切片

    引用 数组、字符串和切片 Go数组中的索引问题 深入解析 Go 中 Slice 底层实现 Golang 入门 : ...

  • Go 切片(slice)

    Go中,数组的长度是不可变的,但是Go提供了一种灵活的内置类型:切片(也称为动态数组)。 切片的长度不固定,可以追...

  • 第03天(复合类型)_03

    13_数组做函数参数.go 14_数组指针做函数参数.go 15_切片的长度和容量.go 16_切片的创建.go ...

  • 15.Go_Slice(切片)

    Go 切片 定义切片 切片初始化 len()和cap()函数 空(nil)切片 切片拦截 append() 和co...

  • 深入理解 Go Slice

    原文地址:深入理解 Go Slice 是什么 在 Go 中,Slice(切片)是抽象在 Array(数组)之上的特...

网友评论

      本文标题:GO中的切片

      本文链接:https://www.haomeiwen.com/subject/pjzjvttx.html