实现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 相关文章推荐
Go Gin实现文件上传下载的示例代码
Apr 02 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 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 stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
php类中private属性继承问题分析
2012/11/01 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
php文件上传的两种实现方法
2016/04/04 PHP
js 小数取整的函数
2010/05/10 Javascript
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
Jquery焦点图实例代码
2014/11/25 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
Python写的英文字符大小写转换代码示例
2015/03/06 Python
python读取Excel表格文件的方法
2019/09/02 Python
python 画图 图例自由定义方式
2020/04/17 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
python3 kubernetes api的使用示例
2021/01/12 Python
xml有哪些解析技术?区别是什么
2016/04/26 面试题
类、抽象类、接口的差异
2016/06/13 面试题
二手房购房意向书范本
2014/04/01 职场文书
感恩的心主题班会
2015/08/12 职场文书
详解nodejs内置模块
2021/05/06 NodeJs
MySql数据库触发器使用教程
2022/06/01 MySQL
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis