【问题标题】:How do I remove duplicates from a struct slice? [closed]如何从结构切片中删除重复项? [关闭]
【发布时间】:2020-10-01 15:38:08
【问题描述】:

我有一个这样的结构:

type structData struct {
      dataName string
      dataNum int
}

我已经从它们中创建了一个切片,如下所示:

dataSlice := []*structData{}

我有一个循环填充dataName 字符串,在此之后,我希望检查结构切片并删除重复项。 我特别提到这一点是因为目前dataNum 为0。所以,我不想检查我的结构中的字符串是否相同,检查整个结构是否相等是完全可以的(如果可能的话,否则我也可以检查dataName 字符串中的重复项,我只是不知道在设计中哪个更好看)。

我的结构切片的示例输出:

&{dataname1 0}
&{dataname1 0}
&{dataname2 0}
&{dataname2 0}

我想要的样子:

&{dataname1 0}
&{dataname2 0}

【问题讨论】:

  • 你试过什么?你遇到了什么问题?
  • 我尝试制作地图,但没有成功,例如,我没有收到任何错误,但没有删除重复项。也许,我没有正确使用带有结构的地图,但我不确定,我不正确理解结构,所以我放弃了这个想法,认为它根本行不通。
  • 请更新您的问题以显示您尝试过的代码并详细说明您遇到的问题。

标签: go struct slice


【解决方案1】:

您可以使用映射来检查重复项,其中您的结构是映射的键。

package main

import (
    "fmt"
)

type structData struct {
    dataName string
    dataNum  int
}

func (d *structData) String() string {
    return fmt.Sprintf("(%s,%d)", d.dataName, d.dataNum)
}

func main() {
    dataSlice := []*structData{
        {"dataname1", 0},
        {"dataname1", 0},
        {"dataname2", 0},
        {"dataname2", 0},
    }
    m := map[structData]struct{}{}
    dataSlice2 := []*structData{}
    for _, d := range dataSlice {
        if _, ok := m[*d]; !ok {
            dataSlice2 = append(dataSlice2, d)
            m[*d] = struct{}{}
        }
    }
    fmt.Printf("%v\n", dataSlice)
    fmt.Printf("%v\n", dataSlice2)
}

https://play.golang.org/p/wL-SfBCMGQj

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多