有没有办法为golang唯一的map[string]interface{}?

问题描述 投票:0回答:2

就像 php 的

array_unique
函数一样:

$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);

输出:

Array
(
    [a] => green
    [0] => red
    [1] => blue
)

谢谢!

dictionary go
2个回答
3
投票

没有内置方法可以做到这一点,因此您需要自己创建一个函数。

如果你想做一个通用的功能,你就必须使用

reflect
。如果您有特定的地图类型,那么您可以更轻松地制作它:

package main

import (
    "fmt"
)

func Unique(m map[string]string) map[string]string {
    n := make(map[string]string, len(m))
    ref := make(map[string]bool, len(m))
    for k, v := range m {
        if _, ok := ref[v]; !ok {
            ref[v] = true
            n[k] = v
        }
    }

    return n
}

func main() {
    input := map[string]string{"a": "green", "0": "red", "b": "green", "1": "blue", "2": "red"}
    unique := Unique(input)
    fmt.Println(unique)
}

可能的输出

地图[a:绿色 0:红色 1:蓝色]

游乐场

注意

因为地图不维护顺序,所以你无法知道哪些键将被剥夺。


0
投票
package main

import "fmt"

type MyType interface {
    int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | string
}

func Unique[T MyType](m []T) []T {
    var k2 int
    un := []T{}
    for k1, v1 := range m {
        for k2 = 0; k2 < k1 && v1 != m[k2]; k2++ {
        }
        if k1 == k2 || v1 != m[k2] {
            un = append(un, v1)
        }
    }
    return un
}

func main() {
    input := []string{"green", "red", "green", "blue", "red"}
    unique := Unique(input)
    fmt.Println(unique)
}

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.