实现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
Go缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
Golang: 内建容器的用法
May 05 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
goland 设置project gopath的操作
May 06 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang map映射的用法
Apr 22 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go gorilla/sessions库安装使用
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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
php异常处理技术,顶级异常处理器
2012/06/13 PHP
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
js仿360开机效果
2019/12/26 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
Python中的装饰器用法详解
2015/01/14 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
Python BS4库的安装与使用详解
2018/08/08 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
古驰英国官网:GUCCI英国
2020/03/07 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
期末考试动员演讲稿
2014/01/10 职场文书
毕业生自荐书
2014/02/02 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书