实现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各时间字符串使用解析
Apr 02 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
go语言中json数据的读取和写出操作
Apr 28 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
对Golang中的FORM相关字段理解
May 02 Golang
Golang中异常处理机制详解
Jun 08 Golang
入门学习Go的基本语法
Jul 07 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Golang数据类型和相互转换
Apr 12 Golang
Go获取两个时区的时间差
Apr 20 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
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
php strtotime 函数UNIX时间戳
2009/01/14 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
javascript 面向对象编程基础:继承
2009/08/21 Javascript
js 小贴士一星期合集
2010/04/07 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
微信小程序 页面跳转事件绑定的实例详解
2017/09/20 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
物理研修随笔感言
2014/02/14 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
Springboot中如何自动转JSON输出
2022/06/16 Java/Android