美文网首页
06. Go极简教程 slice的基础使用

06. Go极简教程 slice的基础使用

作者: 超级大柱子 | 来源:发表于2018-06-02 22:33 被阅读27次

    数组的长度不可改变,切片长度是可变的, 相当于可变数组

    package main
    
    import (
        "log"
        "sort"
    )
    
    func main() {
    
        // 声明一个数组, 数组需要指定长度
        var arr = [10]string{}
    
        // 声明一个切片, 不需要指定长度
        var slice = []string{}
    
        log.Println(arr)   // [       ]
        log.Println(slice) // []
    
        // 使用make方法创建切片, 初始大小为0, 最大大小为10, 设定一个足够大的最大值, 会使得切片获得更高的性能
        var a = make([]string, 0, 10)
    
        // 给切片a添加一个对象
        a = append(a, "dog")
    
        // 给切片添加多个对象
        a = append(a, "cat", "fish", "bird", "menkey")
    
        // 合并两个切片, {}...是解构数组
        a = append(a, []string{"dog2", "cat2", "fish2", "bird2", "menkey2"}...)
    
        // 查看切片长度
        log.Println(len(a))
    
        // 查看切片的最大长度
        log.Println(cap(a))
    
        // 截取切片
        a = a[1:6] // 保留a[1], a[2], [3], a[4], a[5]
    
        // 切片删除 a[2], a...是解构数组
        a = append(a[:2], a[2+1:]...)
    
        // 切片插入元素 a[2] = "newA2"
        var temp = append(a[:2], "newA2")
        a = append(temp, a[2+1:]...)
    
        // 切片升序排序
        a = append(a, "apple")
        sort.Strings(a)
        log.Println(a) //[apple cat dog2 fish newA2]
    
        // 切片降序排序
        sort.Sort(sort.Reverse(sort.StringSlice(a)))
        log.Println(a) //[apple cat dog2 fish newA2]
    
        // 切片的拷贝
        tempCopy := make([]string, len(a))
        copy(tempCopy, a)
    
        // 切片的遍历
        for i, v := range a {
            log.Println(i, v)
        }
    
        // 切片的去重
        a1 := []string{"dog", "cat", "dog", "dog", "fish", "fish"}
        a2 := []string{}
        for _, v1 := range a1 {
            canAdd := true
            for _, v2 := range a2 {
                if v1 == v2 {
                    canAdd = false
                }
            }
            if canAdd {
                a2 = append(a2, v1)
            }
        }
        log.Println("去重:", a2) //去重: [dog cat fish]
    
        // 切片交集
        b_one := []string{"dog", "cat", "dog", "dog", "fish", "fish"}
        b_two := []string{"monkey", "fish", "dog"}
        b2 := []string{}
        for _, v1 := range b_one {
            canAdd := false
            for _, v2 := range b_two {
                if v1 == v2 {
                    canAdd = true
                }
            }
            if canAdd {
                b2 = append(b2, v1)
            }
        }
        log.Println("交集:", b2) //交集: [dog cat fish]
    
        // 切片指针
        // 切如果动态修改了大小, go会创建一个新的切片, 地址就变化了, 如果要获得一直获得内存地址, 可以使用切片指针
        var b []string
        var p = &b
    
        *p = append(*p, "dog")
        log.Println(*p)
        *p = append(*p, "cat")
        log.Println(*p)
    }
    
    

    参考资料:
    http://go-tour-zh.appspot.com/
    http://www.jb51.net/article/127812.htm

    Go极简教程 继续阅读( 目录)

    相关文章

      网友评论

          本文标题:06. Go极简教程 slice的基础使用

          本文链接:https://www.haomeiwen.com/subject/kufdsftx.html