关于数组:golang数组和切片

一、数组

定义:

var 数组名 [数组大小]数组类型
var a [5]int // 定义完数组各个元素就有默认值

  1. 数组的地址能够通过数组名来获取&arr
  2. 数组的第一个元素的地址,就是数组的首地址
  3. 数组的各个元素的地址距离是根据数组类型决定的,如int64->8

arr[0]的地址加8个字节就是arr[1] 的地址

四种初始化形式:

func main() {

 var arr [3]int = [3]int{1, 2, 3}

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

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

 var arr3 = [...]string{0: "xxx", 1: "zzz"}

}

for range 遍历数组:

func main() {
// 第一个返回值index是数组的下标
// 第二个返回值value是下标对应的值
// 他们都是仅在for循环外部可见的变量
 var arr3 = [...]string{0: "xxx", 2: "zzz"}

 for index,value := range arr3 {

 fmt.Printf("索引:%v, 值:%vn", index, value)

 }
}

一、切片

切片是数组的援用

func main() {

 var intArr [5]int = [...]int {1, 2, 33, 44, 56}

 // 援用数组下标为1,最初的下标为3(但不包含3) 22, 33

 slice := intArr[1:3]

 fmt.Println("数组:", intArr)

 fmt.Println("切片:", slice)

 fmt.Println("切片个数:", len(slice))

 fmt.Println("切片容量:", cap(slice)) // 切片的容量能够动态变化

}

切片内存存储
切片不存储任何元素, 只是对现有数组的援用,对切片的任何批改,都反映在底层数组中。

slice从底层来说,其实就是一个数据结构(struct构造体)
type slice struct {

ptr *[2]int // 数组的第几个元素的地址
len int
cap int

}

切片的应用形式

  1. 定义一个切片,而后让切片援用一个曾经创立好的数组。
 var intArr [5]int = [...]int {1, 2, 33, 44, 56}    
 slice := intArr[1:3]
  1. 通过make来创立切片。
// var 切片名 []type = make([]int, len, cap)
// 对于切片必须先make再应用
var slice []int = make([]int, 2, 4)


通过make形式创立的切片对应的数组是由make底层保护,对外不可见,只能通过slice去拜访各个元素

  1. 定义一个切片,间接就指定具体数组,应用原理相似make的形式
var slice []int = []int{1, 2, 4}

切片细节
var slice = arr[0:end] 能够简写成 var slice = arr[:end]
var slice = arr[start:len(arr)] 能够简写成 var slice = arr[start:]
var slice = arr[0:len(arr)] 能够简写成 var slice = arr[:]
切片能够持续切片
append 内置函数,能够对切片进行动静减少

var slice []int = []int{1, 2, 3}
slice2 := append(slice, 400, 500)


切片append操作的实质是对数组扩容
go底层会创立一个新的数组newArr
将slice原来蕴含的元素拷贝到新的数组newArr
slice从新援用到newArr,newArr底层保护,程序员不可见

切片的拷贝copy,a和slice的数据空间是独立的,互不影响。

var slice []int = []int{1, 2, 3}
var a = make([]int, 10)
copy(a, slice)

string和切片关系

var str string = "hello@atguigu"

 // 获取atguigu

 slice := str[6:]

 // string 是不可变的,不能str[0] = "z",来批改字符串

 // 要批改可将string->[]byte  或 string->[]rune

 arr1 := []byte(str)

 arr1[0] = 'z'

 str = string(arr1)

 //  []byte是通过字节解决的,不能解决中文,因为一个中文占3个字节,须要转成[]rune

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据