实现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原生库的中bytes.Buffer用法
Apr 25 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
解决golang 关于全局变量的坑
May 06 Golang
Golang二维数组的使用方式
May 28 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Go 语言结构实例分析
Jul 04 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang 实现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下MAIL的另一解决方案
2006/10/09 PHP
php简单静态页生成过程
2008/03/27 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
详解Angular4 路由设置相关
2017/08/26 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现问号表达式(?)的方法
2013/11/27 Python
python抓取百度首页的方法
2015/05/19 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
印刷工程专业应届生求职信
2013/09/29 职场文书
行政经理岗位职责
2013/11/09 职场文书
美德好少年主要事迹
2014/01/29 职场文书
预备党员政审材料
2014/02/04 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android
5道关于python基础 while循环练习题
2021/11/27 Python
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技