就像 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
)
谢谢!
没有内置方法可以做到这一点,因此您需要自己创建一个函数。
如果你想做一个通用的功能,你就必须使用
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:蓝色]
注意
因为地图不维护顺序,所以你无法知道哪些键将被剥夺。
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)
}