package main
import"fmt"funcmain(){// 验证扩容后, 内存地址会发生变化
a :=make([]int,0,0)for i :=0; i <5; i++{// 使用append进行扩容, append(数组, 元素1, 元素2..)
aa =append(aa,1)
fmt.Printf("aa长度为: %v; 容量为: %v; ptr为: %p\n",len(aa),cap(aa), aa)}}
复制
package main
import"fmt"funcmain(){// 由于切片是引用类型, 所以需要copy方法(深拷贝)
a :=[]int{1,2,3}// 验证引用类型
b := a
b[0]=100
fmt.Println(a, b)// 结果为: [100, 2, 3] [100, 2, 3]// 深拷贝复制
c :=make([]int,len(a),cap(a))// 构建一个容量和长度和 a 相同的切片copy(c, a)
a[0]=100
fmt.Println(a, c)// [1, 2, 3] [100, 2, 3]}
删除
package main
import"fmt"funcmain(){// 使用append将删除元素前后连接起来// append用法: slice = append(slice[start:end], ele1, ele2...)
a :=[]int{1,2,3,4,5}
b =append(a[0:2],4,5)// ...的用法, 表示将切片打散为多个单一元素
c =append(a[0:2], a[3:]...)// a[3:]... 例子中为4, 5}
遍历
package main
import"fmt"funcmain(){
a :=[]int{1,2,3}for k,v :=range a {
fmt.Println(k,v)// k 为索引, v 为值}}
扩展
证明切片是基于数组封装的
a :=[...]int{1,2,3,4}
b := a[:]// 得到切片// 对比两个内存地址, 相同则证明切片是基于数组进行封装的
fmt.Printf("%p",&a)// & 用于得到值类型的内存地址
fmt.Printf("%p", b)// 引用类型不需要&
内存地址变化的几种情况
a :=[...]int{1,2,3,4}
b := a[:]// 得到切片// 1. 当第一个元素的内存地址发生变化
c := b[1:]
fmt.Printf("%p", c)// 与a b的内存地址做对比// 2. 容量发生变化
d :=append(b,6,7)
fmt.Printf("%p", d)// 与a b的内存地址做对比
如何判断切片为空
package main
import"fmt"funcmain(){// 用 3 种方法创建切片, 结果如下var a []int// [], 0, 0
b :=[]int{}// [], 0, 0
c :=make([]int,0,100)// [], 0, 100// 但只有第一种方法创建时, 值实际为 nil// 所以len(slice) == 0 时, 切片为空}
练习 - sort排序
package main
import"fmt"funcmain(){// 使用 sort.Ints(slice)
a :=[]int{1,9,8,2,3,7,6,5,4}// 使用sort对切片进行排序, 改变原切片
sort.Ints(a)
fmt.Println(a)}