array.go
package main
import (
"fmt"
)
// 测试数组是值类型
func printArray(arr [5]int) {
arr[0] = 100
for i, v := range arr {
fmt.Printf("index: %d value: %d\n", i, v)
}
}
// 使用指针可以修改数组
func printArray1(arr *[5]int) {
arr[0] = 100
for i, v := range arr {
fmt.Printf("index: %d value: %d\n", i, v)
}
}
// 使用slice修改数组
func printArray2(arr []int) {
arr[0] = 200
for i, v := range arr {
fmt.Printf("index: %d value: %d\n", i, v)
}
}
func main() {
var arr1 [5]int
//arr2 := [3]int{1, 3, 5}
// 让编译器数数组的长度
arr3 := [...]int{2, 4, 6, 8, 10}
//var grid [4][5]int
fmt.Println("printArray(arr1)")
printArray(arr1)
fmt.Println("printArray(arr3)")
printArray(arr3)
fmt.Println("arr1 and arr3")
fmt.Println(arr1, arr3)
fmt.Println("printArray1(arr1)")
printArray1(&arr1)
fmt.Println("printArray1(arr3)")
printArray1(&arr3)
fmt.Println("arr1 and arr3")
fmt.Println(arr1, arr3)
fmt.Println("printArray2(arr1)")
printArray2(arr1[:])
fmt.Println("printArray2(arr3)")
printArray2(arr3[:])
fmt.Println("arr1 and arr3")
fmt.Println(arr1, arr3)
//fmt.Println(arr1, arr2, arr3)
//fmt.Println(grid)
if false {
// 遍历arr3
for i := 0; i < len(arr3); i++ {
fmt.Println(arr3[i])
}
// 使用range遍历arr3
for i, v := range arr3 {
fmt.Println(i, v)
}
// 不需要下标,使用下划线表示
for _, v := range arr3 {
fmt.Println(v)
}
}
}
slices.go
package main
import "fmt"
// s []int不需要加长度,所以是slice
func updateSlice(s []int) {
s[0] = 100
}
func main() {
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
// slice里面的数据结构,是array的视图,不是值类型
fmt.Println("arr[2:6]", arr[2:6])
fmt.Println("arr[:6]", arr[:6])
s1 := arr[2:]
fmt.Println("s1", s1)
s2 := arr[:]
fmt.Println("s2", s2)
fmt.Println("After updateSlice(s1)")
updateSlice(s1)
fmt.Println(s1)
fmt.Println(arr)
fmt.Println("After updateSlice(s2)")
updateSlice(s2)
fmt.Println(s2)
fmt.Println(arr)
//切片的基础上继续切片
fmt.Println("Reslice")
fmt.Println(s2)
s2 = s2[:5]
fmt.Println(s2)
s2 = s2[2:]
fmt.Println(s2)
//切片共享存储结构
fmt.Println("Extending slice")
arr[0], arr[2] = 0, 2
s1 = arr[2:6]
s2 = s2[3:5] // [s1[3], s1[4]]
fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1, len(s1), cap(s1))
fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d\n", s2, len(s2), cap(s2))
//panic: runtime error: slice bounds out of range [:7] with capacity 6
//fmt.Println(s1[3:7])
}