DAY6 数组和切片

本文详细探讨了Go语言中的数组和切片。介绍了如何声明、初始化及操作数组,强调了切片作为动态数组的特点,如变长、自动扩容以及其与底层数组的关系。通过示例展示了切片的创建、追加元素、修改值以及扩容对底层数组的影响。此外,还讨论了数组和切片的内存分配和多维数组的概念。
摘要由CSDN通过智能技术生成
package main

import "fmt"

func main() {
	//切片:变长数组,动态数组
	//定义:var 切片名 []类型,或者使用make()函数
	/* 	arr := [4]int{1, 2, 3, 4}
	   	s1 := []int{1, 2, 3, 4} //切片,不给出长度
	   	s3 := make([]int, 5, 8) //make([]类型,长度(实际),容量(最多)),就算超过也没关系,切片会自动扩容

	   	fmt.Printf("arr: %v\n", arr)
	   	fmt.Printf("s1: %v\n", s1)
	   	fmt.Printf("%d %d", len(s3), cap(s3))

	   	s4 := make([]int, 0, 5)
	   	fmt.Printf("s4: %v\n", s4)
	   	s4 = append(s4, 1, 2, 3, 4, 5) //append语法
	   	fmt.Printf("s4: %v\n", s4)

	   	s4 = append(s4, s1...) //把s3追加到s4后面
	   	fmt.Printf("s4: %v\n", s4)

	   	for index, value := range s4 {
	   		fmt.Printf("%d %d\n", index, value)
	   	} */

	/*
		切片的内存分配:
		1.每个切片都引用了一个底层数组
		2.切片本身不存储任何数据,都是这个底层数组存储,所以修改切片也是修改这个数组中的数据
		3.向切片中添加数据时如果没有超过容量,则直接添加,如果超过容量则自动扩容
		4.一旦扩容,则指向新的底层数组
	*/
	/* s1 := []int{1, 2, 3}
	fmt.Printf("s1: %v\n", s1)
	fmt.Printf("len:%d  cap:%d\n", len(s1), cap(s1))
	fmt.Printf("%p\n", s1)

	s1 = append(s1, 4, 5, 6)
	fmt.Printf("s1: %v\n", s1)
	fmt.Printf("len:%d  cap:%d\n", len(s1), cap(s1))
	fmt.Printf("%p\n", s1)//每次添加,都改变了一次底层数组,因为已经超出新的容量,必须开辟新的地址 */

	//在新的数组上直接创建slice
	a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	s1 := a[:5]
	s2 := a[3:9]
	s3 := a[3:]
	s4 := a[:]
	fmt.Printf("s1: %v\n", s1)
	fmt.Printf("s2: %v\n", s2)
	fmt.Printf("s3: %v\n", s3)
	fmt.Printf("s4: %v\n", s4)
	s1[3] = 100
	fmt.Printf("s1: %v\n", s1)
	fmt.Printf("a: %v\n", a) //a中也被改了,说明操作切片时是对底层数组进行操作
	s1 = append(s1, 314)
	fmt.Printf("s1: %v\n", s1)
	fmt.Printf("a: %v\n", a) //a中同样被改变
	fmt.Printf("s2: %v\n", s2)
	fmt.Printf("s3: %v\n", s3)
}

一、声明数组
    1.var name [size] type(如:var balance [10] float32)

二、数组初始化
    1.var balance=[5]float32{1000.0,2.0,3.4,7.0,50.0}
    2.balance:=[5]flaot{.......}
    3.如果数组长度不确定,可以使用"..."代替数组长租,编译器会自动推断长度,如:var balance=[...]float32{.......}或者balance:=[...]float32{}

三、访问数组
    1.直接通过索引访问,name[index]

四、多维数组
    1.var name [x][y] type
    2.name:=[x][y] type{{...},{...},{...}}

五、切片(动态数组)
1.由于数组长度不可改变,使用切片有长度不固定,可追加元素,在追加时可能使切片容量增大,切片本身没有任何数据,只是对现有数组的引用。概念上说切片像一个结构体(包含指向数组中slice指定的开始位置,长度,最大长度(slice开始位置到数组最后位置的长度))

    2.定义切片:var name []type,切片不需要说明长度,或者使用make函数创建切片:var slice []type=make([]type,len),也可以简写:slice1:=make([]type,len),也可以指定容量:make([]type,len,capacity)
    3.切片初始化:s:=[] int{1,2,3}或者s:=arr[startindex:endindex]
    4.len()和cap()函数:len()方法可以获取长度,cap()获取最大长度
    5.append和copy:append(numbers,0,1,2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值