ソースを参照

添加maputils

yjp 1 年間 前
コミット
b1e55e451c
2 ファイル変更104 行追加0 行削除
  1. 73 0
      maputils/maputils.go
  2. 31 0
      maputils/maputils_test.go

+ 73 - 0
maputils/maputils.go

@@ -0,0 +1,73 @@
+package maputils
+
+import (
+	"errors"
+	"strconv"
+	"strings"
+)
+
+const (
+	pathSeparator = "."
+)
+
+func FindValueInMap(find map[string]any, path string) (any, error) {
+	if find == nil || strings.TrimSpace(path) == "" {
+		return nil, errors.New("没有传递需要查找的数据或路径")
+	}
+
+	var retValue any
+	var currentFind any
+
+	currentFind = find
+	pathParts := strings.Split(path, pathSeparator)
+	for _, pathPart := range pathParts {
+		if strings.HasPrefix(pathPart, "[") && strings.HasSuffix(pathPart, "]") {
+			indexStr := strings.TrimLeft(strings.TrimRight(pathPart, "]"), "[")
+
+			index, err := strconv.Atoi(strings.Trim(indexStr, " "))
+			if err != nil {
+				return nil, err
+			}
+
+			findSlice, ok := currentFind.([]any)
+			if ok {
+				if index > len(findSlice)-1 {
+					retValue = nil
+				} else {
+					retValue = findSlice[index]
+				}
+			} else {
+				findMapSlice, ok := currentFind.([]map[string]any)
+				if !ok {
+					return nil, errors.New("对应slice路径的值不是slice: " + pathPart)
+				}
+
+				if index > len(findMapSlice)-1 {
+					retValue = nil
+				} else {
+					retValue = findMapSlice[index]
+				}
+			}
+		} else {
+			findMap, ok := currentFind.(map[string]any)
+			if !ok {
+				return nil, errors.New("对应map路径的值不是map: " + pathPart)
+			}
+
+			value, ok := findMap[pathPart]
+			if !ok {
+				return nil, nil
+			}
+
+			retValue = value
+		}
+
+		if retValue == nil {
+			return nil, nil
+		}
+
+		currentFind = retValue
+	}
+
+	return retValue, nil
+}

+ 31 - 0
maputils/maputils_test.go

@@ -0,0 +1,31 @@
+package maputils
+
+import "testing"
+
+func TestFindValueInMap(t *testing.T) {
+	testMap := map[string]any{
+		"foo1": map[string]any{
+			"foo1_sub": []any{
+				"value1", 2,
+			},
+		},
+	}
+
+	value, err := FindValueInMap(testMap, "foo1.foo1_sub.[0]")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if value.(string) != "value1" {
+		t.Fatal("值不一致")
+	}
+
+	value, err = FindValueInMap(testMap, "foo1.foo1_sub.[1]")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if value.(int) != 2 {
+		t.Fatal("值不一致")
+	}
+}