go--数组和切片学习笔记

本文详细介绍了Go语言中的数组和切片的概念、定义、初始化、遍历及多维数组操作。强调了数组长度是类型的一部分,不可改变,而切片作为引用类型,支持动态扩容。通过实例展示了如何从数组创建切片,并分析了数组和切片在赋值和比较上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

数组是存放元素的容器,必须指定存放的元素的类型和容量(长度)

数组的定义

var 数组变量名 [元素个数] T类型
// 如
var arr=[3]int

数组的长度是数组类型的一部分

package main

import "fmt"

func main() {
	var a1 [3]bool
	var a2 [3]bool
	fmt.Printf("a1:%T a2:%T \n",a1,a2)
}

在这里插入图片描述
所以两数组是不能用==来比较和=来赋值

数组的初始化

package main

import "fmt"

func main() {
	var a1 [3]bool
	var a2 [3]bool
	fmt.Printf("a1:%T a2:%T \n", a1, a2) // a1:[3]bool a2:[3]bool
	// 初始化方式1
	a1 = [3]bool{true, true, true} // [true true true]
	fmt.Println(a1)
	// 初始化方式2 根据初始值自动推断
	a10 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}  // [1 2 3 4 5 6 7 8 9 10]
	fmt.Println(a10)
	// 初始化方式3 根据索引来初始化
	a3 := [5]int{1, 3} // [1 3 0 0 0]
	fmt.Println(a3)
	a3 = [5]int{0: 1, 2: 3} // [1 0 3 0 0]
	fmt.Println(a3)
}

数组的遍历

package main

import "fmt"

func main() {
	arr:=[3]string{"成都","上海","北京"}
	for i, s := range arr {
		fmt.Println(i,s)
	}
	for i := 0; i < len(arr); i++ {
		fmt.Println(i,arr[i])
	}
}

多维数组

package main

import "fmt"

func main() {
	arr:=[3][3]int{
		[3]int{1,3,4},
		[3]int{1,3,4},
		[3]int{1,3,4},
	}
	fmt.Println(arr) // [[1 3 4] [1 3 4] [1 3 4]]
	
	arr:=[3][3]int{
		{1,3,4},
		{1,3,4},
		{1,3,4},
	}
   fmt.Println(arr) // [[1 3 4] [1 3 4] [1 3 4]]
}

数组是值类型

package main

import "fmt"

func main() {
	arr:=[3]int{1,3,4}
	arr2:=arr
	arr2[1]=1
	fmt.Println(arr)
	fmt.Println(arr2)

}

在这里插入图片描述

切片(slice)

切面是一个相同元素可变长度的序列,它是对数组的封装,支持自动扩容,他是一个引用类型

切片的定义

var name [] T类型
func main() {
	var a []string
	var b []int
	fmt.Println(a, b)               // [] []
	fmt.Println(a == nil, b == nil) // true true

	a = []string{"a", "b", "c"}
	b = []int{1, 2, 3}
	fmt.Println(a, b)               // [a b c] [1 2 3]
	fmt.Println(a == nil, b == nil) // false false
	
	// cap 方法获取切片的容量  len方法获取切片的长度
	fmt.Printf("let:%d,cap:%d \n", len(a),cap(a)) // let:3,cap:3
	fmt.Printf("let:%d,cap:%d \n", len(b),cap(b)) // let:3,cap:3 
}

由数组得到切片

package main

import "fmt"

func main() {
	var a []string
	var b []int
	fmt.Println(a, b)               // [] []
	fmt.Println(a == nil, b == nil) // true true

	a = []string{"a", "b", "c"}
	b = []int{1, 2, 3}
	fmt.Println(a, b)               // [a b c] [1 2 3]
	fmt.Println(a == nil, b == nil) // false false

	// cap 方法获取切片的容量  len方法获取切片的长度
	fmt.Printf("let:%d,cap:%d \n", len(a), cap(a)) // let:3,cap:3
	fmt.Printf("let:%d,cap:%d \n", len(b), cap(b)) // let:3,cap:3

	a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	s1 := a1[0:4] // 取第0号到第3号元素 (左闭右开)  [1 2 3 4]
	fmt.Println(s1)
	s2 := a1[:4] // 取第0号到第3号元素 (左闭右开)   [1 2 3 4]
	fmt.Println(s2)
	s3 := a1[1:4] // 取第1号到第3号元素 (左闭右开)  [2 3 4]
	fmt.Println(s3)
	s4 := a1[1:] // 取第1号后面的全部元素          [2 3 4 5 6 7 8 9]
	fmt.Println(s4)
	s5 := a1[:] // 全部                         [1 2 3 4 5 6 7 8 9]
	fmt.Println(s5)
	
	// make 定义
	a2:=make([]string,0,0)
	fmt.Printf("let:%d,cap:%d \n", len(a2), cap(a2)) // let:0,cap:0 
	a3:=make([]int,1,3)
	fmt.Printf("let:%d,cap:%d \n", len(a3), cap(a3)) // let:1,cap:3 
}

切片是引用类型

package main

import "fmt"

func main() {
	a1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	a2:=a1
	a2[1]=0
	fmt.Println(a2) // [1 0 3 4 5 6 7 8 9]
	fmt.Println(a1) // [1 0 3 4 5 6 7 8 9]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值