Golang 如何在切片尾部追加元素,又如何删除切片指定索引的元素,以及如何在切片中间插入元素,还有切片之间的复制

package main


import (
    "fmt"
)

func main() {
    //1. 声明字符串类型的切片变量,go自动初始化为nil,长度:0,地址:0
    var ss []string
    fmt.Printf("length:%v \taddr:%p \tisnil:%v", len(ss), ss, ss == nil)
    //2. 切片尾部追加元素
    for i := 0; i < 10; i++ {
        ss = append(ss, fmt.Sprintf("key%d", i))
    }
    fmt.Printf("\n切片尾部追加元素:%s", ss)
    fmt.Printf("\nlength:%v \taddr:%p \tisnil:%v", len(ss), ss, ss == nil)
    //3. 删除切片指定索引的元素
    index := 3
    ss = append(ss[:index], ss[index+1:]...)
    fmt.Printf("\n删除切片指定索引的元素:%s", ss)
    fmt.Printf("\nlength:%v \taddr:%p \tisnil:%v", len(ss), ss, ss == nil)
    //4. 在切片中间插入元素,注意保存后面一部分的元素,必须新建一个临时temp切片
    index = 5
    temp := append([]string{}, ss[index:]...)
    ss = append(ss[:index], "key999")
    ss = append(ss, temp...)
    fmt.Printf("\n在切片中间插入元素:%s", ss)
    fmt.Printf("\nlength:%v \taddr:%p \tisnil:%v", len(ss), ss, ss == nil)
}

调试控制台输出以下信息:

2017/06/30 18:50:46 server.go:73: Using API v1
2017/06/30 18:50:46 debugger.go:97: launching process with args: [/root/code/go/src/contoso.org/book/debug]
API server listening at: 127.0.0.1:2345
2017/06/30 18:50:46 debugger.go:505: continuing
length:0     addr:0x0     isnil:true
切片尾部追加元素:[key0 key1 key2 key3 key4 key5 key6 key7 key8 key9]
length:10     addr:0xc42008e000     isnil:false
删除切片指定索引的元素:[key0 key1 key2 key4 key5 key6 key7 key8 key9]
length:9     addr:0xc42008e000     isnil:false
在切片中间插入元素:[key0 key1 key2 key4 key5 key999 key6 key7 key8 key9]
length:10     addr:0xc42008e000     isnil:false


切片之间的复制范例:

package main

import (
    "fmt"
)

func main() {
    //源切片src的大小是0,使用append动态扩容到16,大小增加到10
    var src = make([]string, 0)
    for i := 0; i < 10; i++ {
        src = append(src, fmt.Sprintf("k%v", i))
    }
    fmt.Printf("src(length=%d)\tcap=%d\t%v\n", len(src), cap(src), src)
    //要保证目标切片dst有足够的大小,注意是大小0,而不是容量10,显然目标切片dst的大小为0,一个元素也别想被拷贝进去
    var dst = make([]string, 0, 10)
    var copied = 0
    copied = copy(dst, src)
    fmt.Printf("copy to dst(length=%d)\tcopied=%d\t%v\n", len(dst), copied, dst)
    //目标切片dst的大小为5
    dst = make([]string, 5)
    copied = copy(dst, src)
    fmt.Printf("copy to dst(length=%d)\tcopied=%d\t%v\n", len(dst), copied, dst)
    //目标切片dst的大小为10
    dst = make([]string, 10)
    copied = copy(dst, src)
    fmt.Printf("copy to dst(length=%d)\tcopied=%d\t%v\n", len(dst), copied, dst)
}

调试控制台输出以下信息:

2017/06/30 18:58:18 server.go:73: Using API v1
2017/06/30 18:58:18 debugger.go:97: launching process with args: [/root/code/go/src/contoso.org/book/debug]
API server listening at: 127.0.0.1:2345
2017/06/30 18:58:18 debugger.go:505: continuing
src(length=10)    cap=16    [k0 k1 k2 k3 k4 k5 k6 k7 k8 k9]
copy to dst(length=0)    copied=0    []
copy to dst(length=5)    copied=5    [k0 k1 k2 k3 k4]
copy to dst(length=10)    copied=10    [k0 k1 k2 k3 k4 k5 k6 k7 k8 k9]


切片容量的扩容规则:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值