切片追加
数组切片
s := []int{1, 2, 3}
ss := s[1:]
ss[0]=100
上面的例子,由于切片是指针,所以当ss改变的后,s的值也会一起改变 但当追加元素过后呢
s := []int{1, 2, 3}
ss := s[1:]
ss = append(ss, 4)
ss[0]=100
此时情况就变了,因为s的len和cap都是3,ss是len和cap分别是2,2 所以当append过后 由于超出cap会重新创建一个切片,所以此后ss的变化都不会影响到s 完整代码如下
package main
import (
"fmt"
)
func main() {
s := []int{1, 2, 3}
fmt.Printf("%p %p %p\n",&s,&s[0],&s[1])
ss := s[1:]
ss[0]=100
fmt.Println(len(s),cap(s))
fmt.Println(len(ss),cap(ss))
fmt.Printf("%p %p %p\n",&ss,&ss[0],&ss[1])
ss = append(ss, 4)
fmt.Println(len(s),cap(s))
fmt.Println(len(ss),cap(ss))
for _, v := range ss {
v += 10
}
for i := range ss {
ss[i] += 10
}
fmt.Println(s)
fmt.Println(ss)
}
结果如下:
0xc42007c080 0xc42007c0a0 0xc42007c0a8
3 3
2 2
0xc42007c0e0 0xc42007c0a8 0xc42007c0b0
3 3
3 4
[1 100 3]
[110 13 14]
如果两个切片追加可以通过
append([]int{1, 2}, []int{3, 4}...)
修改切片
func modify(s []int) {
s[0] = 0
}
func main() {
s := []int{1, 2, 3}
modify(s)
fmt.Println(s)
}
上面的方法肯定能修改的,没有问题,但下面的情况则不一样
package main
import (
"fmt"
)
func pop(s []int) {
s = s[:len(s)-1]
}
func main() {
s := []int{1, 2, 3}
pop(s)
fmt.Println(s)
}
输出的结果是
[1 2 3]
上面s的值并没有变化,是因为pop里面的s是值传递,s在pop内部已经被重新赋值了。当然修改还是会成功的
func pop(s []int) {
s = s[:len(s)-1]
s[1]=100
}
那么s将会是
[1 100 3]
切片排序
package main
import (
"fmt"
"sort"
)
type S struct {
v int
}
func main() {
s := []S{{1}, {3}, {5}, {2}}
sort.Slice(s, func(i, j int) bool { return s[i].v < s[j].v })
fmt.Printf("%#v", s)
}
切片和数组
数组和切片一个是值引用一个是指针引用
func main() {
s := [...]int{2:2,10:-1}
fmt.Println(s)
s1 := s
s1[1] = 33
fmt.Println(s)
}
上面的方法是数组,s1的变化不会引起s的变化,但
s := []int{2:2,10:-1}
但如果s切片,那么此时s1的变化同时会引起s变化