实现GO语言对数组切片去重


Posted in Golang onApril 20, 2022

Go语言是2007年由Google开发的一种静态强类型的编译型语言,其语法结构上与C非常接近。在垃圾回收、错误处理以及包库方面比C要方便的多,因此从开发速度上来讲比C要快的多,而运行速度也接近于C语言。以下实现GO语言对数组切片去重

1.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 {
            temp[item] = struct{}{}
            result = append(result, item)
        }
    }
    return result
}

2.自定义一个适配多个切片类型的去重器

下面对吗主要看

1.自定义sliceError结构体并实现Error方法
2.最后default中返回sliceError中自动会调用Errors使转换成error。

package common

import (
    "fmt"
)

type sliceError struct {
    msg string
}

func (e *sliceError) Error() string {
    return e.msg
}

func Errorf(format string, args ...interface{}) error {
    msg := fmt.Sprintf(format, args...)
    return &sliceError{msg}
}

func removeDuplicateElement1(originals interface{}) (interface{}, error) {
    temp := map[string]struct{}{}
    switch slice := originals.(type) {
    case []string:
        result := make([]string, 0, len(originals.([]string)))
        for _, item := range slice {
            key := fmt.Sprint(item)
            if _, ok := temp[key]; !ok {
                temp[key] = struct{}{}
                result = append(result, item)
            }
        }
        return result, nil
    case []int64:
        result := make([]int64, 0, len(originals.([]int64)))
        for _, item := range slice {
            key := fmt.Sprint(item)
            if _, ok := temp[key]; !ok {
                temp[key] = struct{}{}
                result = append(result, item)
            }
        }
        return result, nil
    default:
        err := Errorf("Unknown type: %T", slice)
        return nil, err
    }
}

补充:

通过map键的唯一性去重(推荐)

//通过map键的唯一性去重
func RemoveRepeatedElement(s []int) []int {
    result := make([]int, 0)
    m := make(map[int]bool) //map的值不重要
    for _, v := range s {
        if _, ok := m[v]; !ok {
            result = append(result, v)
            m[v] = true
        }
    }
    return result
}

通过map键的唯一性去重

定义一个新切片(数组),存放原数组的第一个元素,然后将新切片(数组)与原切片
(数组)的元素一一对比,如果不同则存放在新切片(数组)中。

func RemoveRepeatedElement(arr []int) (newArr []int) {
    newArr = make([]int, 0)
    for i := 0; i < len(arr); i++ {
        repeat := false
        for j := i + 1; j < len(arr); j++ {
            if arr[i] == arr[j] {
                repeat = true
                break
            }
        }
        if !repeat {
            newArr = append(newArr, arr[i])
        }
    }
    return
}

到此这篇关于GO语言对数组切片去重的实现的文章就介绍到这了!

Golang 相关文章推荐
golang json数组拼接的实例
Apr 28 Golang
golang import自定义包方式
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
Golang 编译成DLL文件的操作
May 06 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang日志包的使用
Apr 20 Golang
详解Go语言中Get/Post请求测试
Jun 01 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 Golang
Golang日志包的使用
Apr 20 #Golang
Golang获取List列表元素的四种方式
Apr 20 #Golang
Golang 对es的操作实例
Apr 20 #Golang
Golang 遍历二叉树
Apr 19 #Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 #Golang
Golang 字符串的常见操作
Golang 链表的学习和使用
You might like
使用PHP socke 向指定页面提交数据
2008/07/23 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
PHP连接access数据库
2015/03/27 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
JS一次前端面试经历记录
2020/03/19 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
跟老齐学Python之for循环语句
2014/10/02 Python
Python六大开源框架对比
2015/10/19 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
保护母亲河倡议书
2014/04/14 职场文书
合伙经营协议书范本
2014/04/18 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
流动人口婚育证明
2014/10/19 职场文书
世界文化遗产导游词
2015/02/13 职场文书
旗帜观后感
2015/06/08 职场文书
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis