go数组取交集截取

golang获取交集没有PHP那样的array的操作函数,只能 for 循环判断

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)
}

转载自:https://www.jianshu.com/p/8192f2e807bc

posted @ 2020-01-14 16:26  许伟强  阅读(2620)  评论(0编辑  收藏  举报