浏览代码

添加Slice转Map的函数

yjp 1 年之前
父节点
当前提交
ec19ef7585
共有 2 个文件被更改,包括 39 次插入1 次删除
  1. 14 0
      slice/slice.go
  2. 25 1
      slice/slice_test.go

+ 14 - 0
slice/slice.go

@@ -18,3 +18,17 @@ func RemoveRepeatElement[T comparable](elements []T) []T {
 
 	return result
 }
+
+func ToMap[S any, K comparable, V any](slice []S, fn func(sliceValue S) (K, V, error)) (map[K]V, error) {
+	m := make(map[K]V, len(slice))
+	for _, v := range slice {
+		key, value, err := fn(v)
+		if err != nil {
+			return nil, err
+		}
+
+		m[key] = value
+	}
+
+	return m, nil
+}

+ 25 - 1
slice/slice_test.go

@@ -1,6 +1,10 @@
 package slice
 
-import "testing"
+import (
+	"strconv"
+	"strings"
+	"testing"
+)
 
 func TestRemoveRepeatElement(t *testing.T) {
 	strSlice := []string{"1", "2", "1", "3", "2", "4", "3"}
@@ -24,3 +28,23 @@ func TestRemoveRepeatElement(t *testing.T) {
 		t.Fatal("整型slice移除元素后不正确")
 	}
 }
+
+func TestToMap(t *testing.T) {
+	testSlice := []string{"1::one", "2::two"}
+	resultMap, err := ToMap(testSlice, func(v string) (int, string, error) {
+		parts := strings.Split(v, "::")
+		key, err := strconv.Atoi(parts[0])
+		if err != nil {
+			return 0, "", err
+		}
+
+		return key, parts[1], nil
+	})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if resultMap[1] != "one" || resultMap[2] != "two" {
+		t.Fatal("Map生成错误")
+	}
+}