第一步:安装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
//可以使用get方法将数据读出

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", "."), "远程数据")

即可读出目标节点对应值