Go语言学习 _基础03 _数组和切片
1、数组
package array_test
import "testing"
func TestArrayInit(t *testing.T){
var arr [3]int // 声明方式 1
arr1 := [4]int{1,2,3,4} // 声明方式 2
arr2 :=[...]int{1,2,3,4,5} // 声明方式 3 省去对于空间大小的声明 通过初始化来确定 空间大小
arr1[1] = 5
t.Log(arr[1],arr[2])
t.Log(arr1,arr2)
}
func TestArrayTravel(t *testing.T){
arr3 := [...]int{1,2,3,5}
for i := 0; i < len(arr3); i++{ // 传统遍历
t.Log(arr3[i])
}
for idx,e :=range arr3{
t.Log(idx,e) // idx —— 索引值
}
for _,e :=range arr3{ // TODO Go语言有严格的 编程约束,
// TODO 如果 不关心 index 可以使用 下划线 来表示忽略此返回值,但不能没有这个 返回参数的 占位符
t.Log(e) // idx —— 索引值
}
}
// 数组的截取(切片) —— 切头去尾、不可使用负数
func TestArraySection(t *testing.T){
arr3 :=[...]int{1,2,3,4}
arr3_sec := arr3[:] // 全部取
for idx,e :=range arr3_sec{
t.Log(idx,e) // idx —— 索引值
}
arr3_sec = arr3[0:2]
for idx,e :=range arr3_sec{
t.Log(idx,e) // idx —— 索引值
}
}
2、切片
package slice_test
import (
"fmt"
"testing"
)
func TestSliceInit(t *testing.T) {
var s0 []int
t.Log(len(s0), cap(s0))
s0 = append(s0, 1)
t.Log(len(s0), cap(s0))
s1 := []int{1, 2, 3, 4}
t.Log(len(s1), cap(s1))
s2 := make([]int, 3, 5)
t.Log(len(s2), cap(s2))
//t.Log(s2[0],s2[1],s2[2],s2[3],s2[4]) panic: runtime error: index out of range [3] with length 3 [recovered]
// panic: runtime error: index out of range [3] with length 3
t.Log(s2[0], s2[1], s2[2])
// TODO 切片的结构,本质上切片是一个结构体 由 指针 长度(len) 容量(cap) 三个要素组成
// TODO 只有 在 len 范围内 才是可访问的 元素
s2 = append(s2, 1)
t.Log(len(s2), cap(s2))
t.Log(s2[0], s2[1], s2[2], s2[3])
// TODO cap 为切片的 扩充 提供了 空间
}
func TestSliceGrowing(t *testing.T) {
s := []int{}
for i := 0; i < 10; i++ {
s = append(s, i)
t.Log(len(s), cap(s))
t.Log(s)
fmt.Println()
}
// TODO 观察输出 可以看到 每次 存入新元素前 如果会是的 cap < len 那么 cap就会 变成 cap*2
// TODO 来满足增长需求,这也是 为什么 append() 操作之后要把新切片返回给原切片 因为 操作可能带来 空间位置的改变
}
func TestSliceShareMeory(t *testing.T) {
year := []string{"Jan", "Feb", "Mar", "Arp", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
Q2 := year[3:6]
t.Log(Q2, len(Q2), cap(Q2)) // len = 3 ,cap =9 ( cap 会一直 延伸到 这个数组结束的 位置)
summer := year[5:8]
t.Log(summer, len(summer), cap(summer))
summer[0] = "Unknow"
t.Log(Q2)
t.Log(year)
// TODO 从输出 可以观察到 切片共享 内存的 特性
// TODO 如果 源自同一数组的 两个 切片 其一改变 另一个 可能会被影响
}
func TestSliceComparing(t *testing.T) {
//a := []int{1, 2, 3, 4}
//b := []int{1, 2, 3, 4}
//if a == b { // 不能进行比较
// t.Log("equal")
//}
// invalid operation: a == b (slice can only be compared to nil)
}