Go语言append()和copy():向切片追加元素和复制切片
函数 copy() 会复制切片元素,将源切片中的元素复制到目标切片中,返回复制的元素的个数。copy() 方法不会建立源切片与目标切片之间的联系。也就是两个切片不存在联系,其中一个修改不影响另一个。
以上两个方法不适用于数组。
利用切片截取及 append() 函数实现切片删除元素。删除第一个元素,具体方法如下所示。
numbers = numbers[1:]
删除最后一个元素,具体方法如下所示。numbers = numbers[:len(numbers)-1]
删除中间元素,具体方法如下所示。
a := int(len(numbers)/2)
fmt.Println(a)
numbers = append(numbers[:a], numbers[a+1:] ...)
package main
import "fmt"
func main(){
fmt.Println("1. --------------------")
numbers := make([]int, 0, 20)
printSlices("numbers:", numbers)
numbers = append(numbers, 0)
printSlices("numbers:", numbers)
/*向切片添加一个元素*/
numbers = append(numbers, 1)
printSlices("numbers:", numbers)
/*同时添加多个元素*/
numbers = append(numbers, 2, 3, 4, 5, 6, 7)
printSlices("numbers:", numbers)
fmt.Println("2. --------------------")
//追加一个切片
s1 := []int{100, 200, 300, 400, 500, 600, 700}
numbers = append(numbers, s1...)
printSlices("numbers:", numbers)
fmt.Println("3. -------------------")
//切片删除元素
//删除第一个元素
numbers = numbers[1:]
printSlices("numbers:", numbers)
//删除最后一个元素
numbers = numbers[:len(numbers)-1]
printSlices("numbers:", numbers)
//删除中间一个元素
a := len(numbers)/2
fmt.Println("中间数:", a)
numbers = append(numbers[:a], numbers[a+1:]...)
printSlices("numbers:", numbers)
fmt.Println("4. ==================")
/*创建切片numbers1是之前切片的两倍容量*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/*复制numbers的内容到numbers1*/
count := copy(numbers1, numbers)
fmt.Println("复制个数:", count)
printSlices("numbers1:", numbers1)
numbers[len(numbers)-1] = 99
numbers1[0]= 100
/*numbers1与numbers两者不存在联系, numbers发生变化时,
numbers1是不会随着变化的。也就是说copy方法是不会建立两个切片的联系的
*/
printSlices("numbers1:", numbers1)
printSlices("numbers:", numbers)
}
//输出切片格式化信息
func printSlices(name string, x []int){
fmt.Print(name, "\t")
fmt.Printf("addr:%p \t len=%d \t cap=%d \t slice=%v\n", x, len(x), cap(x), x)
}
运行结果如下:
1. --------------------
numbers: addr:0xc000092000 len=0 cap=20 slice=[]
numbers: addr:0xc000092000 len=1 cap=20 slice=[0]
numbers: addr:0xc000092000 len=2 cap=20 slice=[0 1]
numbers: addr:0xc000092000 len=8 cap=20 slice=[0 1 2 3 4 5 6 7]
2. --------------------
numbers: addr:0xc000092000 len=15 cap=20 slice=[0 1 2 3 4 5 6 7 100 200 300 400 500 600 700]
3. -------------------
numbers: addr:0xc000092008 len=14 cap=19 slice=[1 2 3 4 5 6 7 100 200 300 400 500 600 700]
numbers: addr:0xc000092008 len=13 cap=19 slice=[1 2 3 4 5 6 7 100 200 300 400 500 600]
中间数: 6
numbers: addr:0xc000092008 len=12 cap=19 slice=[1 2 3 4 5 6 100 200 300 400 500 600]
4. ==================
复制个数: 12
numbers1: addr:0xc000094000 len=12 cap=38 slice=[1 2 3 4 5 6 100 200 300 400 500 600]
numbers1: addr:0xc000094000 len=12 cap=38 slice=[100 2 3 4 5 6 100 200 300 400 500 600]
numbers: addr:0xc000092008 len=12 cap=19 slice=[1 2 3 4 5 6 100 200 300 400 500 99]
package main
import(
"fmt"
"strconv"
)
func main(){
//思考:使用哪种初始化切片的方式更高效?
var sa []string
//sa := make([]string, 0, 20)
printSliceMsg(sa)
//当使用append追加元素到切片时, 如果容量不够, Go就会创建一个新的切片变量来储存元素
for i := 0; i < 15; i++ {
sa = append(sa, strconv.Itoa(i))
printSliceMsg(sa)
}
printSliceMsg(sa)
}
//打印输出格式化信息
func printSliceMsg(sa []string){
fmt.Printf("addr:%p \t len:%v \t cap:%d \t value:%v \n", sa, len(sa), cap(sa), sa)
}
运行结果如下:
addr:0x0 len:0 cap:0 value:[]
addr:0xc0000421f0 len:1 cap:1 value:[0]
addr:0xc000004500 len:2 cap:2 value:[0 1]
addr:0xc0000180c0 len:3 cap:4 value:[0 1 2]
addr:0xc0000180c0 len:4 cap:4 value:[0 1 2 3]
addr:0xc000092000 len:5 cap:8 value:[0 1 2 3 4]
addr:0xc000092000 len:6 cap:8 value:[0 1 2 3 4 5]
addr:0xc000092000 len:7 cap:8 value:[0 1 2 3 4 5 6]
addr:0xc000092000 len:8 cap:8 value:[0 1 2 3 4 5 6 7]
addr:0xc000094000 len:9 cap:16 value:[0 1 2 3 4 5 6 7 8]
addr:0xc000094000 len:10 cap:16 value:[0 1 2 3 4 5 6 7 8 9]
addr:0xc000094000 len:11 cap:16 value:[0 1 2 3 4 5 6 7 8 9 10]
addr:0xc000094000 len:12 cap:16 value:[0 1 2 3 4 5 6 7 8 9 10 11]
addr:0xc000094000 len:13 cap:16 value:[0 1 2 3 4 5 6 7 8 9 10 11 12]
addr:0xc000094000 len:14 cap:16 value:[0 1 2 3 4 5 6 7 8 9 10 11 12 13]
addr:0xc000094000 len:15 cap:16 value:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
addr:0xc000094000 len:15 cap:16 value:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
声明:《Go系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
ICP备案:
公安联网备案: