第一步:安装Golang Viper
terminal终端 运行 go get github.com/spf13/viper
第二步 基础配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ViperInstance := viper.New() ViperInstance.SetConfigName("config") ViperInstance.SetConfigType("json") ViperInstance.AddConfigPath(".") ViperInstance.OnConfigChange(func(e fsnotify.Event) { fmt.Println("Config file changed:", e.Name) }) ViperInstance.WatchConfig() ConfigStatus := true if err := ViperInstance.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { ConfigStatus = false fmt.Println("配置文件不存在.") } else { ConfigStatus = false fmt.Println("配置文件存在.但存在错误") } }
|
读配置文件
若节点值为字符串 则使用ViperInstance.GetString('内为json节点')
方法
若节点值为一个数组 如: [“1”,”2”,”3”] 则使用 ViperInstance.GetStringSlice()
方法
若节点值为嵌套型数组 若不写Json对应的结构体,则可以使用反射获取层级关系获取值
1 2 3 4 5
| { "replaces": [ {"target":"","result": [""]} ] }
|
如果现有功能需要进行文本替换 target 为目标值 result 为一个数组 其中的值随机进行替换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
func replaceFun(url string, replaces interface{}) string { if reflect.TypeOf(replaces).Kind() == reflect.Slice { s := reflect.ValueOf(replaces) for i := 0; i < s.Len(); i++ { ele := s.Index(i) target := ele.Interface().(map[string]interface{})["target"].(string) result := reflect.ValueOf(ele.Interface().(map[string]interface{})["result"]) if target != "" && result.Len() != 0 { randTime := rand.New(rand.NewSource(time.Now().UnixNano())) randomValue := result.Index(randTime.Intn(result.Len())).Elem().String() if randomValue != "" { url = strings.ReplaceAll(url, target, randomValue) } } } } return url } replaces := ViperInstance.Get("replaces") var extDeJson map[string]interface{} if err := json.Unmarshal(data, &extDeJson); err != nil { } value := "目标替换值" result := replaceFun(value, replaces)
|
若 Json配置文件中 某项 “result_node” 的值 是目标远程节点Json结果的节点地址 如 “data.src”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| func GetFieldFromJson(path []string, value []byte) string { var temp jsoniter.Any for i, v := range path { if i == 0 { temp = jsoniter.Get(value, v) if temp == nil { return "" } } else { temp = temp.Get(v) if temp == nil { return "" } } } switch temp.ValueType() { case jsoniter.ArrayValue: return jsoniter.Get(value, "data", 0).ToString() case jsoniter.InvalidValue, jsoniter.NilValue, jsoniter.BoolValue, jsoniter.ObjectValue: return "" case jsoniter.StringValue: return temp.ToString() case jsoniter.NumberValue: return strconv.Itoa(temp.ToInt()) } return "" }
|
value := GetFieldFromJson(strings.Split("data.src", "."), "远程数据")
即可读出目标节点对应值