实现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 28 Golang
golang import自定义包方式
Apr 29 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
golang中的并发和并行
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
深入理解go slice结构
Sep 15 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang 遍历二叉树
Apr 19 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
php获得文件扩展名三法
2006/11/25 PHP
PHP 超链接 抓取实现代码
2009/06/29 PHP
php foreach、while性能比较
2009/10/15 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
javascript 数组排序函数
2009/08/20 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
详解项目升级到vue-cli3的正确姿势
2019/01/28 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
python实现车牌识别的示例代码
2019/08/05 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
行政主管职责范本
2014/03/07 职场文书
留守儿童工作方案
2014/06/02 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
Python 文字识别
2022/05/11 Python