go array and slice
package main
import (
"fmt"
)
//数组的初始化方式
func arrayInit() {
fmt.Println("array init!")
a := [4]int{1, 3, 5, 7}
b := [...]int{2, 4, 6, 8}
c := [...]int{3: 10, 5: 20}
d := [...]struct {
x uint
y uint
}{
{50, 20},
{30, 40},
}
e := [...][2]int{
{1, 3},
{5, 7},
}
fmt.Println("a:", a)
fmt.Println("b:", b)
fmt.Println("c:", c)
fmt.Println("d:", d)
fmt.Println("e:", e)
}
func sliceInit() {
fmt.Println("slice init!")
a := []int{1, 3, 5, 7}
b := []int{2, 4, 6, 8}
c := []int{3: 10, 5: 20}
d := []struct {
x uint
y uint
}{
{50, 20},
{30, 40},
}
e := [][]int{
{1, 3},
{5, 7, 9},
}
fmt.Println("a:", a, cap(a))
fmt.Println("b:", b, cap(b))
fmt.Println("c:", c, cap(c))
fmt.Println("d:", d, cap(d))
fmt.Println("e:", e, cap(e))
}
func sliceAppend() {
fmt.Println("slice append")
data := [6]int{0, 1, 2}
s1 := data[:3]
s2 := append(s1, 100, 200, 300)
s3 := append(s2, 100, 200, 300)
fmt.Println("data:", data)
fmt.Println("s1:", s1)
fmt.Println("s2:", s2)
fmt.Println("s3:", s3)
//s2还是指向原数组的
s2[5] = 1000
fmt.Println("data:", data)
//因为append s2时超出了数组的容量 ,所以s3是从新分配的一个数组,和原数组没有任何关联
s3[5] = 100000
fmt.Println("data:", data)
}
/*
* 错误的append示范
* 在子slice中append元素可能会覆盖掉主slice中原本的元素
*/
func errorAppend() {
fmt.Println("error append example")
s1 := []int{1, 2, 3, 4, 5}
s2 := s1[:3]
fmt.Println("s1:", s1)
s2 = append(s2, 0)
fmt.Println("s2 append 0")
fmt.Println("s1:", s1)
}
func main() {
arrayInit()
sliceInit()
sliceAppend()
errorAppend()
}