Array数组
数组定义与初始化
数组定长的有序序列,元素类型相同,值类型的数据对象
package main
import "fmt"
func main() {
// 定义数组
var arr1 [3]int
// 初始化数组
arr1 = [3]int{0,0,0}
// 定义时初始化
arr2 := [3]int{1, 2, 3}
fmt.Println(arr1)
fmt.Println(arr2)
fmt.Printf("%T,%T", arr1, arr2)
}
-------------------------------------------
[0 0 0]
[1 2 3]
[3]int,[3]int
// 初始化时,根据值的数量来确定长度
arr3 := [...]int{1, 2, 3, 4, 5}
// 根据索引初始化数组,为赋值索引为0
arr4 := [5]int{0: 1, 1: 2, 2: 4, 3: 8, 4: 16}
遍历数组
package main
import "fmt"
func main() {
arr4 := [5]int{0: 1, 1: 2, 2: 4, 3: 8, 4: 16}
// 索引遍历
for i := 0; i < len(arr4); i++ {
fmt.Println(arr4[i])
}
// for range 遍历
for i, v := range arr4 {
fmt.Println(i, v)
}
}
多维数组
package main
import "fmt"
func main() {
arr5 := [3][2]int{
[2]int{1, 2},
[2]int{3, 4},
[2]int{5, 6},
}
fmt.Println(arr5)
}
遍历多维数组
package main
import "fmt"
func main() {
arr5 := [3][2]int{
[2]int{1, 2},
[2]int{3, 4},
[2]int{5, 6},
}
// 多维数组的遍历
for _, v1 := range arr5 {
// fmt.Println(i1, v1)
for _, v2 := range v1 {
fmt.Println(n, v2)
}
}
}
数组求和
package main
import "fmt"
func Sum(arr []int) int {
sum := 0
for _, v := range arr {
sum += v
}
return sum
}
func main() {
arr5 := [...]int{1, 3, 5, 7, 9}
fmt.Println(Sum(arr5[:]))
}
切片
相同类型,可变长的数组,基于数组,是引用型数据指向数组。
package main
import "fmt"
func main() {
var s1 []int
var s2 []string
// 未初始化时,值为nil,未开辟存储空间
fmt.Println(s1 == nil)
fmt.Println(s2 == nil)
s1 = []int{1, 2, 3}
s2 = []string{"北京", "上海", "广州", "深圳"}
fmt.Println(s1, s2)
// 从数组得到切片
a1 := [...]int{1, 2, 3, 4, 5}
s3 := a1[0:3]
fmt.Println(s3)
fmt.Printf("%T,%T", s3, a1)
}
-----------------------------------------------------
true
true
[1 2 3] [北京 上海 广州 深圳]
[1 2 3]
[]int,[5]int
make()函数创建切片
package main
import "fmt"
func main() {
s1 := make([]int, 5, 10)
fmt.Println(s1)
// 输出长度(当前存储的数据量)
fmt.Println(len(s1))
// 输出容量(能够存储的数据总量)
fmt.Println(cap(s1))
}
切片Append
package main
import "fmt"
func main() {
// 扩容切片
s1 := []string{"北京", "上海", "广州"}
fmt.Println(s1)
fmt.Println(len(s1), cap(s1))
// 必须用原来的变量接收返回值
//扩容时重新开辟内容空间创建数组存储数组,地址改变需要重新引用
s1 = append(s1, "深圳")
fmt.Println(s1)
// 扩容容量翻倍(不同版本策略不同)
fmt.Println(len(s1), cap(s1))
}
-------------------------------------
[北京 上海 广州]
3 3
[北京 上海 广州 深圳]
4 6
切片Copy
package main
import "fmt"
func main() {
// 拷贝cppy
s1 := []string{"北京", "上海", "广州"}
var s2 []string = make([]string, 3)
copy(s2, s1)
s1[0] = "天津"
fmt.Println(s1, s2)
}
从切片中删除元素
package main
import "fmt"
func main() {
// 拷贝cppy
s1 := []string{"北京", "上海", "广州"}
s1 = append(s1[:0], s1[1:]...)
fmt.Println(s1)
}
-----------------------
[上海 广州]
删除索引为index
的元素, 操作方法是:a=append(a[:index],a[index+1])
make和new的区别
1.make和new都是用来申请内存空间的
2.new很少用,一般是给基本数据类型申请内存的,例如string、int,返回的是对应类型的指针(*int
、*string
)。
3.make是用来给slice、map、chan申请内存的,make函数返回类型对应这三钟类型