实现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 25 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang 结构体数据集合
Apr 22 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
深入理解 Golang 的字符串
May 04 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动态柱状图实现方法
2015/03/30 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
js window.event对象详尽解析
2009/02/17 Javascript
javascript 变量作用域 代码分析
2009/06/26 Javascript
javascript json 新手入门文档
2009/12/03 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
原生JS实现自定义下拉单选选择框功能
2018/10/12 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
windows下搭建python scrapy爬虫框架步骤
2018/12/23 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
九年级化学教学反思
2014/01/28 职场文书
合作经营协议书范本
2014/04/17 职场文书
工程承包协议书
2014/04/22 职场文书
培训研修方案
2014/06/06 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
教师个人发展总结
2015/02/11 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL