ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Golang中append与copy内置函数介绍

2021-12-05 19:02:05  阅读:175  来源: 互联网

标签:slice lst2 cap len Golang lst copy append addr


append

package a_slice_copy

import (
    "fmt"
    "strconv"
    "testing"
)

// TODO append函数
func printSlice(name string, x []string) {
    fmt.Print(name, " > ")
    fmt.Printf("addr:%p len=%d cap=%d slice=%v \n", x, len(x), cap(x), x)
}

// append 自动扩容测试
func TestT1(t *testing.T) {
    var sa []string
    printSlice("sa", sa)

    // 当使用append追加元素到切片时,如果容量不够,Go会创建一个新的切片变量来存储元素
    for i := 0; i < 10; i++ {
        sa = append(sa, strconv.Itoa(i))
        printSlice("sa", sa)
    }
    printSlice("sa", sa)
}

/*
TODO Test1 测试结果如下
sa > addr:0x0 len=0 cap=0 slice=[]
sa > addr:0xc000044510 len=1 cap=1 slice=[0]
sa > addr:0xc000026080 len=2 cap=2 slice=[0 1]
sa > addr:0xc0000106c0 len=3 cap=4 slice=[0 1 2]
sa > addr:0xc0000106c0 len=4 cap=4 slice=[0 1 2 3]
sa > addr:0xc00010a080 len=5 cap=8 slice=[0 1 2 3 4]
sa > addr:0xc00010a080 len=6 cap=8 slice=[0 1 2 3 4 5]
sa > addr:0xc00010a080 len=7 cap=8 slice=[0 1 2 3 4 5 6]
sa > addr:0xc00010a080 len=8 cap=8 slice=[0 1 2 3 4 5 6 7]
sa > addr:0xc00011a000 len=9 cap=16 slice=[0 1 2 3 4 5 6 7 8]
sa > addr:0xc00011a000 len=10 cap=16 slice=[0 1 2 3 4 5 6 7 8 9]
sa > addr:0xc00011a000 len=10 cap=16 slice=[0 1 2 3 4 5 6 7 8 9]
*/

// append其他操作
func TestT2(t *testing.T) {
    // 初始化一个slice
    lst := make([]string, 0, 20)
    printSlice("lst", lst)

    // 两种append的方法
    lst = append(lst, "whw", "naruto")
    printSlice("lst", lst)
    lst = append(lst, []string{"sasuke", "www", "sakurua"}...)
    printSlice("lst", lst)

    // 删除第一个元素
    //lst = lst[1:]
    //printSlice("lst", lst)
    //// 删除最后一个元素
    //lst = lst[:len(lst)-1]
    //printSlice("lst", lst)
    // 删除中间的元素
    mid := int(len(lst) / 2)
    lst = append(lst[:mid], lst[mid+1:]...)
    printSlice("lst", lst)
}

/*
TODO Test2测试结果入下:
lst > addr:0xc0000d0140 len=0 cap=20 slice=[]
lst > addr:0xc0000d0140 len=2 cap=20 slice=[whw naruto]
lst > addr:0xc0000d0140 len=5 cap=20 slice=[whw naruto sasuke www sakurua]
lst > addr:0xc0000d0140 len=4 cap=20 slice=[whw naruto www sakurua]
*/

copy函数

string的情况

// As a special case, it also will copy bytes from a string to a slice of bytes
func TestT4(t *testing.T){

    // TODO case1:
    bs1 := []byte{'A','M'}
    s1 := "Naruto"
    count := copy(bs1, s1)
    // 只 copy 了2个
    fmt.Println("count> ", count) // 2
    fmt.Println("bs1: ", string(bs1)) // Na

    // TODO case2:
    s2 := "Sasuke"
    bs2 := make([]byte,len(s2))
    count2 := copy(bs2, s2)
    fmt.Println("count2: ", count2) // 6
    fmt.Println("bs2:: ", string(bs2)) // bs2::  Sasuke
}

源切片没有数据的情况

// TODO 源切片没有数据的情况
func TestT3(t *testing.T) {
    lst := make([]string, 0, 20)
    lst = append(lst, "whw", "naruto")
    lst = append(lst, []string{"sasuke", "www", "sakurua"}...)
    printSlice("lst", lst) // lst > addr:0xc0000d0140 len=5 cap=20 slice=[whw naruto sasuke www sakurua]

    // 创建切片 长度与容量是之前的2倍
    lst2 := make([]string, len(lst)*2, cap(lst)*2)
    count := copy(lst2, lst)
    fmt.Println("count>>> ", count) // TODO 这里count是5!!!
    printSlice("lst2", lst2)        // lst2 > addr:0xc0000d2500 len=10 cap=40 slice=[whw naruto sasuke www sakurua     ]

    // TODO lst2 与 lst 不存在任何关系!!!
    lst2[0] = "abc"
    printSlice("lst2", lst2) // lst2 > addr:0xc000148500 len=10 cap=40 slice=[abc naruto sasuke www sakurua     ]
    printSlice("lst", lst)   // lst > addr:0xc000146140 len=5 cap=20 slice=[whw naruto sasuke www sakurua]
}

源切片有数据的情况

// 源切片有数据的情况
func TestT5(t *testing.T) {
    lst := make([]string, 0, 20)
    lst = append(lst, "whw", "naruto")
    lst = append(lst, []string{"sasuke", "www", "sakurua"}...)
    printSlice("lst", lst) // lst > addr:0xc0000d0140 len=5 cap=20 slice=[whw naruto sasuke www sakurua]

    // 创建切片 长度与容量是之前的2倍
    lst2 := make([]string, len(lst)*2, cap(lst)*2)
    // TODO 源切片追加数据
    lst2 = append(lst2, "WWW","HHH")
    // TODO 可以看到 是追加到了最后2位置了
    printSlice("lst2", lst2) // lst2 > addr:0xc0000da500 len=12 cap=40 slice=[          WWW HHH]

    // TODO 第一 第二 个位置,写入元素
    lst2[0] = "大王"
    lst2[1] = "小王"
    printSlice("lst2", lst2) // lst2 > addr:0xc000112500 len=12 cap=40 slice=[大王 小王         WWW HHH]

    count := copy(lst2, lst)
    fmt.Println("count>>> ", count) // TODO 这里count是5
    // TODO 把原来的数据覆盖了!!!
    printSlice("lst2", lst2)  // lst2 > addr:0xc0000da500 len=12 cap=40 slice=[whw naruto sasuke www sakurua      WWW HHH]

    // TODO lst2 与 lst 不存在任何关系!!!
    lst2[0] = "abc"
    printSlice("lst2", lst2) // lst2 > addr:0xc0000da500 len=12 cap=40 slice=[whw naruto sasuke www sakurua      WWW HHH]
    printSlice("lst", lst)   // lst > addr:0xc000146140 len=5 cap=20 slice=[whw naruto sasuke www sakurua]
}

~~~

标签:slice,lst2,cap,len,Golang,lst,copy,append,addr
来源: https://www.cnblogs.com/paulwhw/p/15646455.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有