美文网首页
Go语言-数组和切片

Go语言-数组和切片

作者: 小孩真笨 | 来源:发表于2018-10-06 22:28 被阅读0次

1 数组的定义

定义数组常规格式是:var 数组名 [元素数量] 元素类型 = {各元素},实际使用中,可以有很多灵活的操作。如有下面几种定义数组的方式:

  • 只声明不赋值
  • 使用语法糖:=以省略var关键字,此时需要对数组进行赋值
  • 使用...在定义的时候不指定个数,由程序通过所赋值的结果自己计算。定义时候需要赋值!

下面是几种定义方式的实现案例:

package main

import "fmt"

func main() {
    var arr1 [5] int
    arr2 := [3]int{1,2,3}
    arr3 := [...]int{3,2,32,465,64,3}

// 二维数组的定义分别代表行列数
    var grid [4][5]int
    
    fmt.Println(arr1,arr2,arr3)
    fmt.Println(grid)
}

程序的输出结果是:


说明
数组定义需要在元素类型前面加上[...]或者[数字],需要注意的是,在使用的时候,如果方括号中间不带任何东西,那么他代表的是一个数组的切片,就不是指这个数组了。所以,需要在定义一个含有数组参数的函数时,需要带上方括号内的东西。

[10]int和[20]int是不同的类型

2 数组的遍历

数组的遍历可以采用常规的for - len的形式,不过建议还是使用Go语言中提供的range方法,该关键字能够直接获取到数组的下标和对应的元素值。例如:

for i, v := range arr3 {
        fmt.Println(i, "->", v)
}

程序对应的输出结果是:


当然,可以直接获取下标,另外通过arr3[i]的方式获取元素。

说明
需要注意的是:数组也是值传递的。在函数内部修改一个数组,如果不是从地址层面进行了修改。那么脱离了函数之后,不会影响老数组。也就是说,func f(arr [10]int)拷贝数组


Go语言中一般不直接使用数组,而是使用切片。下一节着重介绍切片的概念。

3 切片:slice

所谓切片是指取数组的一小段数组元组子集。slice是对数组的一个view(视图)。

首先定义一个数组arr:=[...]int{0,1,2,3,4,5,6,7},取一个切片s:=arr[2:6],s就是一个切片。s的取值是[2,6),因此,s这个切片的取值是:[2,3,4,5]

同样的,可以省略切片的start或者end,或者 全部省略代表全部数组元素。

以切片为参数的时候,方括号内部不用加数字。

更新某个数组的切片,是会更新数组内容的。

package main

import "fmt"

func printArray(arr []int){
    arr[0]=100
    for i,v :=range arr{
        fmt.Println(i,"->",v)
    }
}

func main() {
    var arr1 = [5]int {1,2,3,4,5}

    slice:=arr1[:]

    fmt.Println("更新之前...")
    fmt.Println(arr1)

    fmt.Println("======================")
    printArray(slice)

    fmt.Println("更新之后...")
    fmt.Println(arr1)
    
}

上述程序的输出结果是:


也就是说,切片作为参数实现了数组指针作为参数的作用。但是省却了很多的麻烦写法。

3.1 Slice的上下限和容量

切片中的概念

slice中有三个概念:指针,长度和容量
参照上图可知:

  • ptr:一个切片的起始内存地址
  • len:一个切片的长度:也就是这个切片中的当前元素个数
  • cap:一个切片的扩展后的总容量

切片是基于数组的视图,所以,有一定的可见域。如果切片的下界超过了数组的最终容量,只会显示到数组的最后元素完成后就结束。

1. slice可以向后扩展,不可以向前扩展

  1. s[i] 不可以超越len(s),向后扩展不可以超越底层数组cap(s)。

3.2 向slice中添加元素

  • 添加元素的时候如果超越cap,系统会重新分配更大的底层数组
  • 由于值传递的关系,必须接收append的返回值
  • s = append(s,val)

一种创建切片的方法: 使用系统内置的make方法。

// 创建一个长度为10的切片,默认值都是元素0
s := make([]int, 10)
// 创建一个长度为10, 容量为32的切片,默认值都是元素0
s := make([]int, 10, 32)

相关文章

  • Go语言切片

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

  • 七、Go切片

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

  • Go 切片和数组

    数组 go创建数组和 c 语言类似,有如下两种方式: 切片 切片声明和数组类似,只是没有传递长度 创建二维切片,并...

  • go语言 数组和切片

    新手对于数组和切片要如何区分,概念比较模糊,看看下面的说明就懂了 记住,如果在[]运算符里指定了一个值,那么创建的...

  • Go语言数组和切片

    数组 数组概念 数组就是用于保存一组相同类型的数据 定义格式 操作数组的格式 数组的初始化 (赋值) 先定义再初...

  • Go语言数组和切片

    此处数组只讲Go语言中和C语言不一样的地方 格式不同:Go语言定义数组的格式:var ages [3]int 定义...

  • Go语言-数组和切片

    1 数组的定义 定义数组常规格式是:var 数组名 [元素数量] 元素类型 = {各元素},实际使用中,可以有很多...

  • Go语言--数组和切片

    一.数组1)定义: 2)初始化 二.切片1)定义: 2)初始化: 三.区别 数组是固定大小; 切片可以扩容 四.举...

  • Go语言第3天 - 常用数据类型

    以下内容部分参考自Go语言基础数据类型Go语言中的数组切片:特立独行的可变数组Go语言数据类型-数组Go标准容器之...

  • 《golang高级编程》-读书笔记

    《Go语言高级编程》 作者 柴树杉 曹春晖 1.3 数组、字符串和切片 Go语言拷贝字符串,只是复制了底层字节数组...

网友评论

      本文标题:Go语言-数组和切片

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