实现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通过递归遍历生成树状结构的操作
Apr 28 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
golang生成并解析JSON
Apr 14 Golang
Go语言测试库testify使用学习
Jul 23 Golang
Go中使用gjson来操作JSON数据的实现
Aug 14 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 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
php实现下载限制速度示例分享
2014/02/13 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
js获取视频时长代码
2014/04/10 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
vue项目中使用fetch的实现方法
2019/04/25 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
收集的几个Python小技巧分享
2014/11/22 Python
Python验证码识别的方法
2015/07/10 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
2019/08/22 Python
python 字符串常用函数详解
2019/09/11 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
实习自我鉴定模板
2013/09/28 职场文书
药剂专业学生求职信范文
2013/12/28 职场文书
幼儿运动会邀请函
2014/01/17 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
青年志愿者活动方案
2014/08/17 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
车辆年检委托书范本
2014/10/14 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
民政工作个人总结
2015/02/28 职场文书
银行招聘自荐信
2015/03/06 职场文书
护理自荐信
2019/05/14 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android