1、数组
Go 语⾔提供了数组类型的数据结构。
数组是具有相同唯⼀类型的⼀组已编号且⻓度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符 串或者⾃定义类型。
数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第⼀个元素索引为 0,第⼆个索引为 1,以 此类推。
1.1、数组的定义
= 是赋值, := 是声明变量并赋值
1.2、数值取值
1.3、二维数组
2.Go语言切片(slice)
Go 语⾔切⽚是对数组的抽象。
Go 数组的⻓度不可改变,在特定场景中这样的集合就不太适⽤,Go 中提供了⼀种灵活,功能强悍的内置类型切⽚ ("动态数组"),与数组相⽐切⽚的⻓度是不固定的,可以追加元素,在追加时可能使切⽚的容量增⼤。
切片中的概念:
- len:长度
- cap:容量
2.1、定义切片
[root@nginx-kafaka03 08-06]# cat test.go
package main
import "fmt"
func main() {
var slice1 []int
fmt.Println(slice1)
var slice2 []int = make([]int,5)
fmt.Println(slice2)
slice3 := make([]int,5)
fmt.Println(slice3)
}
[root@nginx-kafaka03 08-06]# go run test.go
[]
[0 0 0 0 0]
[0 0 0 0 0]
2.2、切片初始化
[root@nginx-kafaka03 08-06]# cat test.go
package main
import "fmt"
func main() {
s := [] int{1,2,3}
s1 := s[0:2]
fmt.Println(s,s1)
}
[root@nginx-kafaka03 08-06]# go run test.go
[1 2 3] [1 2]
2.3、len()和cap()函数
切⽚是可索引的,并且可以由 len() ⽅法获取⻓度。
切⽚提供了计算容量的⽅法 cap() 可以测量切⽚最⻓可以达到多少。
以下为具体实例:
2.4、切片截取
可以通过设置下限及上限来设置截取切⽚ [lower-bound:upper-bound],实例如下:
2.5、append()函数和copy()函数
如果想增加切⽚的容量,我们必须创建⼀个新的更⼤的切⽚并把原分⽚的内容都拷⻉过来。
下⾯的代码描述了从拷⻉切⽚的 copy ⽅法和向切⽚追加新元素的 append ⽅法。
看变量地址
数组和切片的区别:
3、数组与切片
3.1 数组的容量和⻓度
数组的容量和⻓度是⼀样的。cap() 函数和 len() 函数均输出数组的容量(即⻓度)
3.2 类型
数组是 值类型 ,将⼀个数组赋值给另⼀个数组时,传递的是⼀份拷⻉。
切⽚是 引⽤类型 ,切⽚包装的数组称为该切⽚的底层数组。看下⾯的例⼦:
注意数组是⼀个固定⻓度的,初始化时候必须要指定⻓度,不指定⻓度的话就是切⽚了
3.3、隐藏数组
Go的切⽚是在数组之上的抽象数据类型,所以创建的切⽚始终都有⼀个数组存在。 举例说明:
[a b c d e] [c d] [a b c]
[a b 8 d e] [8 d] [a b 8]
数组与切⽚的赋值形式
从这个例⼦中可以看出,数组的赋值是值的拷⻉,是⼀个全新的数组。⽽切⽚的赋值是引⽤。下⾯再来看⼀个例⼦。
这个例⼦再⼀次说明:数组是赋值是copy,⽽切⽚仅是引⽤。例⼦1和例⼦2中的切⽚的声明⽤到了隐藏数组。再 来看下例⼦3,使⽤⾮隐藏数组的情况。
数组作为参数,被函数调⽤
切⽚被调⽤时,直接传递引⽤