实现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 interface判断为空nil的实现代码
Apr 24 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
对Golang中的FORM相关字段理解
May 02 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Golang的继承模拟实例
Jun 30 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang 遍历二叉树
Apr 19 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设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
Django Rest framework频率原理与限制
2019/07/26 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
降低python版本的操作方法
2020/09/11 Python
python实现控制台输出颜色
2021/03/02 Python
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
中秋节寄语2015
2015/03/24 职场文书
刑事法律意见书
2015/06/04 职场文书