美文网首页
Golang数组与切片

Golang数组与切片

作者: 突击手平头哥 | 来源:发表于2021-04-11 01:42 被阅读0次

Golang数组与切片

数组的声明

func main() {
    var arr1 [3]int
    fmt.Println(arr1)

    var arr2 = [3]int{1, 2, 3}
    var arr3 = [...]int{1, 2, 3}

    fmt.Println(arr2, arr3)
}
[0 0 0]
[1 2 3] [1 2 3]
  • Golang中的数组属于静态数组,不允许动态扩展
  • Golang中数组会默认初始化值
  • 可以通过[...]int{1,2,3}的方式初始化数组

数组的传值

Golang中数组与C++中的容器类似,是值而不是指针和引用

func updateArr(arr [3]int) {
    arr[0] = 100
}

func main() {
    var arr1 [3]int
    fmt.Println(arr1)

    updateArr(arr1)
    fmt.Println(arr1)
}
[0 0 0]
[0 0 0]
  • Golang中的数组是值,进行赋值操作得到的是一个全新的数组
  • Golang[3]int[4]int是不同的类型,不能相互赋值

指针传递

Golang中是支持指针

func updateArr(arr *[3]int) {
    arr[0] = 100
}

func main() {
    var arr1 [3]int
    fmt.Println(arr1)

    updateArr(&arr1)
    fmt.Println(arr1)
}
[0 0 0]
[100 0 0]

  通过指针可以进行数组的传递修改,同时和C语言不同的是对于数组指针来说不需要解引用

切片

Golang中的切片语法类似于Python,但是底层实现迥然不通

func updateArr(arr []int) {
    arr[0] = 100
}

func main() {
    var arr1 [3]int
    fmt.Println(arr1)

    updateArr(arr1[:])
    fmt.Println(arr1)
}
[0 0 0]
[100 0 0]

  Golang中的切片可以得到类似引用的效果,[]intGolang中指代的是引用类型

Golang中的数组切片


  Golang中的切片结构包括三部分,①指向底层数据结构数组的指针,使用该指针修改数组;②长度,即切片的长度;③切片的容量,切片的容量包括切片的长度和数组中在切片后的元素。

func main() {
    var arr1 = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    fmt.Println(arr1)

    sli1 := arr1[2:8]
    fmt.Println(sli1, len(sli1), cap(sli1))
    fmt.Println("slice [6]: ", sli1[6])
}
[0 1 2 3 4 5 6 7 8 9]
[2 3 4 5 6 7] 6 8
panic: runtime error: index out of range [6] with length 6

goroutine 1 [running]:
main.main()
    c:/Users/zhangyu/Go/src/study/main.go:34 +0x21e
Process exiting with code: 2 signal: false

  虽然切片的容量包括切片后的元素,但是访问报错

向切片添加元素

func main() {
    var arr1 = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    fmt.Println(arr1)

    sli1 := arr1[2:8]
    fmt.Println(sli1, len(sli1), cap(sli1))

    sli2 := append(sli1, 10)
    fmt.Println("sli2 [6]: ", sli2[6])

    sli3 := sli1[6:7]
    fmt.Println("sli3: ", sli3)

    fmt.Println("arr1: ", arr1)
}
[0 1 2 3 4 5 6 7 8 9]
[2 3 4 5 6 7] 6 8
sli2 [6]:  10
sli3:  [10]
arr1:  [0 1 2 3 4 5 6 7 10 9]
  • 切片可以追加元素,追加的元素会覆盖到原有的数组上去
  • 再切片上再次切片,可以获得切片后的元素

append越界了会怎么样?

func main() {
    var arr1 = [...]int{0, 1, 2, 3}
    var sli1 = arr1[2:3:3]

    sli1 = append(sli1, 4)
    fmt.Println(arr1, sli1)
}
[0 1 2 3] [2 4]

  添加元素超过cap后会创建一个新的数组,与原数组无关了

相关文章

  • Golang数组与切片

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

  • 数组与切片-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)],...

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

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

  • Golang:数组与切片的复制

    在Golang中,数组是值类型而切片是引用类型。因此值的复制与切片的复制并不相同。 数组的复制 对于值类型的数组来...

  • 简记python的tuple和slice

    python也有类似于golang中数组和切片的概念。python中的数组为tuple(固定的),切片为list(...

  • Golang 数组 切片

    Golang 数组和切片 go提供了相应数据类型来存储多个相同类型的元素。它们分别是数组和slice切片。其中,切...

  • Golang 中的数组 (array) 和切片 (slice)

    huangwenwei - 字里行间 | Golang 中的数组 (array) 和切片 (slice) 中文描述...

  • Golang数组和切片的区别

    Golang数组和切片的区别 大纲 数组是固定大小 切片不是动态数组,可以扩容 区别 定义方式不一样 初始化方法不...

网友评论

      本文标题:Golang数组与切片

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