实现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 time.Parse和time.Format的时区问题
Apr 29 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
golang 语言中错误处理机制
Aug 30 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
golang为什么要统一错误处理
Apr 03 Golang
Go语言grpc和protobuf
Apr 13 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang bufio详细讲解
Apr 21 Golang
Golang解析JSON对象
Apr 30 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 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
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
php的ajax简单实例
2014/02/27 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
jQuery页面图片伴随滚动条逐渐显示的小例子
2013/03/21 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
JS判断是否手机或pad访问实现方法
2016/12/09 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
基于javascript实现贪吃蛇经典小游戏
2020/04/10 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
毕业生自荐信如何写
2014/03/24 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
聘用意向书
2014/07/29 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
材料员岗位职责
2015/02/10 职场文书
2016年情人节广告语
2016/01/28 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL
vue递归实现树形组件
2022/07/15 Vue.js