Go学习笔记 - 数组和切片

目录

数组

访问数组

切片

声明切片有3种方式

切片追加-Append

切片复制-Copy


数组

  • 数组是值传递,每次传递到方法会复制一份相同的副本
  • 声明数组方式如下
var array_number [10]int  //声明
array_number = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //赋值
array_number := [5]int{1, 2, 3, 4, 5} // ---> 快速初始化
  • 定义数组时如果长度不确定可以使用 ... 代替,编译器会根据元素个数自行推断数组的长度:array_number := [...]int{1, 2, 3, 4, 5}

访问数组

通过坐标索引访问数组,第一个元素从0开始,不支持负数下标

func main() {
	array_number := [...]int{1, 2, 3, 4, 5}

	fmt.Println(array_number[0])  //---> 1
}

遍历数组

array_number := [...]int{1, 2, 3, 4, 5}

for i, number := range array_number {
    fmt.Printf("index %d is %d ", i, number)
}

以上代码输出结果:

0 is 1 1 is 2 2 is 3 3 is 4 4 is 5

切片

切片是长度可变的数组,是数组的抽象,内部包括3个对象

  • Data 指向底层实际的数组的指针
  • Capacity 容器,也就是最大长度
  • Length 长度

声明切片有3种方式

1 . 使用数组的索引坐标方式

array_number := [...]int{1, 2, 3, 4, 5}
slice_number := array_number[1:2] 
fmt.Println(slice_number)
  • 可以省略开始坐标和结束坐标其中一个,或都省略
  • 开始坐标缺省默认0,结束坐标缺省默认最后一个坐标

    slice_number := array_number[:] //从头到尾

2 . 使用字面量

slice_number2 := []int{1, 25, 25}
  • 以上代码表示初始化int类型的切片,底层数组指向{1,25,25},cap=len=3
slice_number3 := make([]int, 3)
slice_number3 := make([]int, 3, 10)
  • make方式创建时提供3个参数
    • 第一个参数数组的type
    • 第二个切片的长度len
    • 第三个时切片的容量,最大长度capacity(非必要)
  • 容量如果大于len时编译会出错

./main.go:10:23: len larger than cap in make([]int)

  • 切片可以通过len(),cap()方法查看长度和容量
fmt.Printf("len=%d cap=%d slice=%v\n", len(slice_number3), cap(slice_number3), slice_number3)

切片追加-Append

切片可以使用append()方法在原有的数组尾部追加元素:

slice_number3 := make([]int, 3, 4)
slice_number3 = append(slice_number3, 2)

追加后长度大于原有容量时会自动进行扩容

  • 容量小于1024时自动扩容为原有容量的2倍
  • 容量大于1024时则每次增加25%,直到满足需求为止
slice_number3 := make([]int, 3, 6)
slice_number3 = append(slice_number3, 2, 4, 6, 5)

fmt.Printf("len=%d cap=%d slice=%v\n", len(slice_number3), cap(slice_number3), slice_number3)

输出结果:

len=7 cap=12 slice=[0 0 0 2 4 6 5]

切片复制-Copy

使用copy()方法复制切片

slice_number := []int{1}
slice_number2 := make([]int, 1, 6)
copy(slice_number2, slice_number)

如果复制前切片的长度大于复制后切片的长度,会自动截取

slice_number := []int{1,2}
slice_number2 := make([]int, 1, 6)
copy(slice_number2, slice_number) //只会复制第一个元素
fmt.Println(slice_number2)  // --打印[1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值