实现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 相关文章推荐
win10下go mod配置方式
Apr 25 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
深入理解go slice结构
Sep 15 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
Go微服务项目配置文件的定义和读取示例详解
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
PHP生成带有雪花背景的验证码
2006/10/09 PHP
php 生成饼图 三维饼图
2009/09/28 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
VBScript版代码高亮
2006/06/26 Javascript
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
2017/02/02 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
法国珠宝店:CLEOR
2017/01/29 全球购物
新年抽奖获奖感言
2014/03/02 职场文书
库房保管员岗位职责
2014/04/07 职场文书
新课培训心得体会
2014/09/03 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL