代码改变世界

golang 学习笔记 -- slice

2023-08-11 13:57  默默不语  阅读(11)  评论(0编辑  收藏  举报
1. 函数调用时传递的参数为拷贝的副本, 在函数内部改变参数的值不会影响原变量。但是 golang 中 slice、map、channel、pointer、function 是引用类型,赋值时拷贝的是指针值,对这些变量作出修改时会影响原变量的值。
2. array(数组)与 slice(切片) 的区别
  1. array
    1. 长度固定。在声明时需要指定长度和初值。作为函数参数时,必须指定数组的大小,且传入的数组长度必须与声明的长度一致。
    2. 值传递。
  2. slice
    1. 动态长度。
    2. 引用传递。但作为参数传递到函数中时,若在函数中对 slice 进行扩容(或缩容?)时不会修改外部的 slice 。
 3. slice 声明方式
  1. var s []T(只声明,不进行初始化)
var s []int
fmt.Println(s == nil) // true
fmt.Println(s) // []
marshal, err := json.Marshal(s)
fmt.Println(string(marshal), err) // null, 反序列化时为nil 
  2. make([]int, len, cap(optional))
s := make([]int, 2, 5)
fmt.Println(s) // [0 0]
fmt.Println(len(s))// 2
fmt.Println(cap(s))// 5
  3. 字面量声明
 s := []int{}
 fmt.Println(s) // []
 fmt.Println(len(s)) // 0
 fmt.Println(cap(s)) // 0
 jsonBytes, _ := json.Marshal(s)
 fmt.Println(string(jsonBytes)) // []
 s = []int{1, 2, 3}
 fmt.Println(s) // [1 2 3]
 fmt.Println(len(s)) // 3
 fmt.Println(cap(s)) // 3