Go如何对数组切片进行去重

原文地址:https://segmentfault.com/a/1190000020696388

Go如何对数组切片进行去重

package main

import (
    "fmt"
)

func main() {
    s := []string{"hello", "world", "hello", "golang", "hello", "ruby", "php", "java"}

    fmt.Println(removeDuplicateElement(s)) //output: hello world golang ruby php java
}

func removeDuplicateElement(languages []string) []string {
    result := make([]string, 0, len(languages))
    temp := map[string]struct{}{}
    for _, item := range languages { 
        if _, ok := temp[item]; !ok { //如果字典中找不到元素,ok=false,!ok为true,就往切片中append元素。
            temp[item] = struct{}{}
            result = append(result, item)
        }
    }
    return result
}
go run demo1.go                             
[hello world golang ruby php java]

解释
removeDuplicateElement函数总共初始化两个变量,一个长度为0的slice,一个空map。由于slice传参是按引用传递,没有创建占用额外的内存空间。
map[string]struct{}{}创建了一个key类型为String值类型为空struct的map,等效于使用make(map[string]struct{})
空struct不占内存空间,使用它来实现我们的函数空间复杂度是最低的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章