Golang 数组与分片

作者: 痕无落 | 来源:发表于2017-09-07 21:24 被阅读41次

与数组的区别

  • 数组是固定长度的,而分片确实可动态增长的,以定义为例:
// 定义数组, 一定要指定长度
var names [5]string

// 定义分片, 不需要指定长度
var names []string
  • 在函数调用时, 数组是值传递,而分片是引用传递

其实对于 golang 来讲,函数调用的时候都是值传递,拷贝一个副本, 之所以表现为值传递和引用传递,在于一个拷贝的是数据值,另一个拷贝的是数据指针,两个指针值指向的是同一个内存地址。

分片的实现

分片的底层数据还是使用的数组,它一共包含 3 个字段:

  1. 地址指针
  2. 长度
  3. 容量
// source 是一个分片, 大小为 4, 容量为: 5
source := make([]string, 4, 5)
fmt.Println(source, len(source), cap(source))
// 输出: [   ] 4 5

// 注意这里不会进行内存分配, 因为 source 还有剩余空间可以新加数据
source = append(source, "1")
fmt.Println(source, len(source), cap(source))
// 输出: [    1] 5 5

在使用 append 来为分片添加数据时, 是否有内存分配很重要

append 没有内存分配时:

source := []string{"1", "2", "3", "4", "5"}

// 拷贝 source 的第二到第三个元素(不包括第三个)
// copied 的容量包括: 3, 4,5
copied := source[2:3]

fmt.Println("source-->", source)
fmt.Println("copied-->", copied)

fmt.Println("接下来修改 copied 的内容,看是否会对 source 产生影响...")

// 这里 append 内部不会创建一个新的底层数组,共有 source 的底层数组
// 因为 copied 的容量足够新加一个元素
// 所以不会影响到 source 的内容
copied = append(copied, "mike")
fmt.Println("source-->", source)
fmt.Println("copied-->", copied)

输出:

source--> [1 2 3 4 5]
copied--> [3]
接下来修改 copied 的内容,看是否会对 source 产生影响...
source--> [1 2 3 mike 5]
copied--> [3 mike]

append 有内存分配时:

source := []string{"1", "2", "3", "4", "5"}

// 拷贝 source 的第二到第三个元素(不包括第三个)
// copied 的容量包括: 3
copied := source[2:3:3]
// 此时 copied 会和 source 共享底层数组

fmt.Println("source-->", source)
fmt.Println("copied-->", copied)

fmt.Println("接下来修改 copied 的内容,看是否会对 source 产生影响...")

// 这里 append 内部会创建一个新的底层数组,不会共有 source 的底层数组
// 所以不会影响到 source 的内容
copied = append(copied, "mike")
fmt.Println("source-->", source)
fmt.Println("copied-->", copied)

输出:

source--> [1 2 3 4 5]
copied--> [3]
接下来修改 copied 的内容,看是否会对 source 产生影响...
source--> [1 2 3 4 5]
copied--> [3 mike]

相关文章

  • Golang 数组与分片

    与数组的区别 数组是固定长度的,而分片确实可动态增长的,以定义为例: 在函数调用时, 数组是值传递,而分片是引用传...

  • Golang数组与切片

    Golang数组与切片 数组的声明 Golang中的数组属于静态数组,不允许动态扩展 Golang中数组会默认初始...

  • Go-Array

    golang初始化数组 golang中数组为值类型 方式1:指定数组长度 方式2:自行推断数组长度 方式3:指定索...

  • 数组与切片-GOLANG

    golang -@amazeUI -2017-08-02 14:19:14 a := [10]int{1, 2, ...

  • golang 数组与切片

    1. 切片与数组对比 (1). 列表数组是具有固定长度且拥有零个或者多个相同数据类型元素的序列。数组的长度是数组类...

  • 数组与切片 golang

    b 等于 a 的第四个元素到最后一个元素。这是取数组的一部分出来,也可以写作 a[5:],a[5:len(a)],...

  • 指针、数组、分片

    1、指针 Go 拥有指针。指针保存了值的内存地址。类型*T是指向T类型值的指针。其零值为nil。&操作符会生成一个...

  • golang声明一个map数组

    golang 声明一个map数组

  • golang数组append切片添加与删除

    golang数组append切片添加 golang数组删除元素 1.从开头位置删除 2.从中间位置删除 3.从尾部删除

  • 一篇文章理解 golang 中切片与数组的关系

    起始 在 golang 文档中,对数组与切片有一些详细的讲解,本文主要讲解数组与切片的关系 由于是个人理解,可能有...

网友评论

    本文标题:Golang 数组与分片

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