golang 数组和切片

数组概念

特点:

具有相同 唯一类型
一组已编号且长度固定
可以通过索引来读取或者修改
最大长度为 2Gb

声明格式
var identifier [len]typpe
例如:
var arr1 [5] int
var arr2 [10]string在这里插入图片描述
在内存中的结构是:

每个元素是一个整型值,当声明数组时所有的元素都会被自动初始化为默认值 0。arr1 的长度是 5,索引范围从 0 到 len(arr1)-1。

对索引项为 i 的数组元素赋值可以这么操作:arr[i] = value,所以数组是 可变的。

  • 通过 for 初始化数组项
  • 通过 for 打印数组元素
  • 通过 for 依次处理元素
package main
import "fmt"

func main() {
    
    
	var arr1 [5]int
	for i:=0; i < len(arr1); i ++ {
    
    
		arr1[i] = i * 2
	}
	
	a := [...]string{
    
    "a", "b", "c", "d"}
	// i为索引
	for i := range a {
    
    
	    fmt.Println("Array item", i, "is", a[i])
	}
}
数组常量
  1. 第一种
    var arrAge = [5]int{18, 20, 15, 22, 16}

注意 [5]int 可以从左边起开始忽略:[10]int {1, 2, 3} :这是一个有 10 个元素的数组,除了前三个元素外其他元素都为 0。

  1. 第二种
    var arrLazy = [...]int{5, 6, 7, 8, 22}
  2. 第三种
    var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}
Person at 0 is
Person at 1 is
Person at 2 is
Person at 3 is Chris
Person at 4 is Ron

切片

切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型)。

0 <= len(s) <= cap(s)

多个切片如果表示同一个数组的片段,它们可以共享数据;因此一个切片和相关数组的其他切片是共享存储的,相反,不同的数组总是代表不同的存储。数组实际上是切片的构建块。

优点 因为切片是引用,所以它们不需要使用额外的内存并且比使用数组更有效率,所以在 Go 代码中 切片比数组更常用。

声明切片的格式是: var identifier []type(不需要说明长度)

一个由数字 1、2、3 组成的切片可以这么生成:s := [3]int{1,2,3}[:](注: 应先用s := [3]int{1, 2, 3}生成数组, 再使用s[:]转成切片) 甚至更简单的 s := []int{1,2,3}

切片在内存中的组织方式实际上是一个有 3 个域的结构体:指向相关数组的指针,切片长度以及切片容量。下图给出了一个长度为 2,容量为 4 的切片y。

  • y[0] = 3y[1] = 5
  • 切片y[0:4] 由 元素 3,5,7 和 11 组成

在这里插入图片描述
注意 绝对不要用指针指向 slice。切片本身已经是一个引用类型,所以它本身就是一个指针!!

猜你喜欢

转载自blog.csdn.net/qq_43019193/article/details/114642671
今日推荐