教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang struct 切片数组去重

golang struct 切片数组去重

发布时间:2022-03-14   编辑:jiaochengji.com
教程集为您提供golang struct 切片数组去重等资源,欢迎您收藏本站,我们将为您提供最新的golang struct 切片数组去重资源

目录

实例1

实例2

适配多个切片类型


<h3 id="实例1">实例1</h3> <pre><code class="language-Go">type Fts_message_table_content_nomal struct { Docid int64 `xorm:"docid"` C0CreateTime int64 `xorm:"c0CreateTime"` C1MesLocalID int64 `xorm:"c1MesLocalID"` C2Message string `xorm:"c2Message"` C3reservedInt string `xorm:"c3reservedInt"` C4reservedText string `xorm:"c4reservedText"` C5usernameid int64 `xorm:"c5usernameid"` C6CONSTRAINT string `xorm:"c6CONSTRAINT"` } type Message_contents_normal []Fts_message_table_content_nomal func removeDuplicate(personList Message_contents_normal) Message_contents_normal { resultMap := map[string]bool{} for _, v := range personList { data, _ := json.Marshal(v) resultMap[string(data)] = true } result := Message_contents_normal{} for k := range resultMap { var t Fts_message_table_content_nomal json.Unmarshal([]byte(k), &t) result = append(result, t) } return result } </code></pre> <h3 id="实例2">实例2</h3> <pre><code class="language-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 }</code></pre>

解释

<code>removeDuplicateElement</code>函数总共初始化两个变量,一个长度为0的<code>slice</code>,一个空<code>map</code>。由于<code>slice</code>传参是按引用传递,没有创建占用额外的内存空间。

<code>map[string]struct{}{}</code>创建了一个key类型为String值类型为空<code>struct</code>的<code>map</code>,等效于使用<code>make(map[string]struct{})</code>

空<code>struct</code>不占内存空间,使用它来实现我们的函数空间复杂度是最低的。

<h3 id="item-1">适配多个切片类型</h3>

上面的去除重复元素的函数,只能处理字符串切片对于其他类型的切片就不行了。如果不想针对每种类型的切片都写一个去重函数的话可以使用Go的type-switch自己写一个可以处理多个切片类型的函数。下面是我写的一个实现:

<pre><code class="language-Go">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 } }</code></pre>

函数接收一个空接口类型的参数,然后使用类型选择进入相应的分支进行处理。这里可以根据需求添加函数需支持的切片类型的处理程序。

每个分支里同样创建了一个key类型为string值类型为空<code>struct</code>的<code>map</code>。key的值是切片元素的字符串表现形式(类型的<code>String()</code>方法的返回值)

函数返回值的类型是空接口,所以拿到返回值后要进行类型断言才能使用。

 

 

到此这篇关于“golang struct 切片数组去重”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang struct 切片数组去重
Go如何对数组切片进行去重
golang切片内存应用技巧
[go语言]-slice实现的使用和基本原理
连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了
Golang的数组与切片——详解
切片 里面包含interface_Golang数据结构详解之切片
Golang之struct能不能比较
golang slice 最后一个元素_Go 常见的数据结构 Slice
11.深入理解切片(slice)

[关闭]
~ ~