实现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 25 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
入门学习Go的基本语法
Jul 07 Golang
Golang数据类型和相互转换
Apr 12 Golang
golang语言指针操作
Apr 14 Golang
Golang日志包的使用
Apr 20 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 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
其他功能
2006/10/09 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
学习jQuey中的return false
2015/12/18 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
python多线程下信号处理程序示例
2019/05/31 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
python打开windows应用程序的实例
2019/06/28 Python
python清空命令行方式
2020/01/13 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
《英英学古诗》教学反思
2014/04/11 职场文书
2014年小学工作总结
2014/11/26 职场文书
2014年平安夜寄语
2014/12/08 职场文书
淮海战役观后感
2015/06/11 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS