数组
数组属于值类型,在默认情况下是值传递
下标越界会报panic
数组的定义和内存布局
package main
import "fmt"
func main() {
//字符数组定义
var str [2]string
str[0] = "world"
str[1] = "hello"
fmt.Println(str)
//赋值数组的第二种方法
str1 := [2]string{"12", "safas"}
fmt.Println(str1)
//int数组定义
var data [10]int
for i := 0; i < 10; i++ {
data[i] = (i + 1) * 2
}
fmt.Println(data)
//数组赋值第二种方式
data = [10]int{1, 2, 3, 4, 5}
fmt.Println(data)
}
内存布局
- 数组的地址可以通过数组名来获取 &intArr
- 数组第一个元素的地址,就是数组的首地址
- 数组的各个元素的地址间隔是依据数据的类型决定,如:int64-8个字节-64比特,int32-4个字节-32比特
数组初始化的四种方法
var numArr01 [3]int = [3]int{1,2,3}
var numArr02 = [3]int{5,6,7}
var numArr03 = [...]int{8,9,10}
var numArr04 = [...]int{1:900,2:600,3:546}
// 类型推导
strArr05 := [...]string{1:"tom",2:"jack",3:"marry"}
数组的遍历 for range
for index,value :range array01{
遍历体
}
数组的使用步骤
- 声明数组并开辟空间
- 给数组各个元素赋值
- 使用数组
切片
1.切片定义
package main
import "fmt"
func main() {
// 第一种方式
var intArr [5]int = [...]int{1, 2, 3, 4, 5}
slice := intArr[1:4]
fmt.Println("slice的元素是:", slice)
fmt.Println("slice的元素个数是:", len(slice))
fmt.Println("slice的容量是:", cap(slice)) // 切片的容量可以动态变化
/*
slice从底层来说,其实就是一个数据结构(struct结构体)
type slice struct {
ptr *[2]int
len int
cap int
}
*/
// 通过make创建的切片,对应的数组由make底层维护,对外不可见
// var 切片名 []type = make([]type,len,[cap]) type:类型 len:大小 cap:切片容量,如果分配了cap,则要求cap>=len
var slice2 []float64 = make([]float64, 5, 10) // make可以指定切片的大小、容量
slice2[0] = 0.2
slice2[1] = 0.6
fmt.Println(slice2)
slice2 = append(slice2, 6.6, 3.2, 35.5)
fmt.Println(slice2)
}
2.使用切片
3.切片的遍历
package main
import (
"fmt"
)
func main() {
// 第一种方式
var intArr [5]int = [...]int{1, 2, 3, 4, 5}
slice := intArr[1:4]
fmt.Println("slice的元素是:", slice)
fmt.Println("slice的元素个数是:", len(slice))
fmt.Println("slice的容量是:", cap(slice)) // 切片的容量可以动态变化
// 常规遍历
for i := 0; i < len(slice); i++ {
fmt.Printf("sclie[%v]=%v \n", i, slice[i])
}
/*
slice从底层来说,其实就是一个数据结构(struct结构体)
type slice struct {
ptr *[2]int
len int
cap int
}
*/
// 通过make创建的切片,对应的数组由make底层维护,对外不可见
// var 切片名 []type = make([]type,len,[cap]) type:类型 len:大小 cap:切片容量,如果分配了cap,则要求cap>=len
var slice2 []float64 = make([]float64, 5, 10) // make可以指定切片的大小、容量
slice2[0] = 0.2
slice2[1] = 0.6
fmt.Println(slice2)
// 动态追加 切片长度
slice2 = append(slice2, 6.6, 3.2, 35.5)
// for range 遍历
for i, v := range slice2 {
fmt.Printf("i=%v v=%v \n", i, v)
}
fmt.Println(slice2)
}
4.修改string
-
先转为[]byte 或者[]rune
-
修改
二维数组
1.声明
var 数组名 [大小][大小]类型
2.使用方式
-
先定义再赋值
var arr2 [2][3]int arr2[1][1] = 10
-
直接初始化
var arr3 [2][3]int = [2][3]int{{1,2,3},{4,5,6}}
-
二维数组的遍历
- 双层for循环
- 双层for range