| package helper | |
| 
 | |
| import ( | |
| 	"errors" | |
| 	"net/url" | |
| 	"sort" | |
| 	"strings" | |
| ) | |
| 
 | |
| func MergeStringMap(x, y map[string]string) map[string]string { | |
| 
 | |
| 	n := make(map[string]string) | |
| 	for i, v := range x { | |
| 		for j, w := range y { | |
| 			if i == j { | |
| 				n[i] = w | |
| 
 | |
| 			} else { | |
| 				if _, ok := n[i]; !ok { | |
| 					n[i] = v | |
| 				} | |
| 				if _, ok := n[j]; !ok { | |
| 					n[j] = w | |
| 				} | |
| 			} | |
| 		} | |
| 	} | |
| 
 | |
| 	return n | |
| 
 | |
| } | |
| 
 | |
| /** | |
|  * 转换为map string数组 | |
|  * 2021/1/5 | |
|  * gz | |
|  */ | |
| func ToMapStringArray(x interface{}) ([]map[string]string, error) { | |
| 	list, ok := x.([]interface{}) | |
| 	if !ok { | |
| 		return []map[string]string{}, errors.New("type error") | |
| 	} | |
| 
 | |
| 	if len(list) < 1 { | |
| 		return []map[string]string{}, nil | |
| 	} | |
| 	var ret []map[string]string = make([]map[string]string, len(list)) | |
| 	var tmp map[string]interface{} | |
| 	var map_tmp map[string]string | |
| 	var err error | |
| 
 | |
| 	for key, item := range list { | |
| 		if tmp, ok = item.(map[string]interface{}); ok { | |
| 			map_tmp = make(map[string]string) | |
| 			for k, v := range tmp { | |
| 				map_tmp[k] = ToStr(v) | |
| 			} | |
| 			ret[key] = map_tmp | |
| 		} else { | |
| 			err = errors.New("data type error") | |
| 			break | |
| 		} | |
| 	} | |
| 
 | |
| 	return ret, err | |
| } | |
| 
 | |
| /** | |
|  * 将map[string]string数组转成map[string]interface数组 | |
|  */ | |
| func MapStringToInterfaceArr(src []map[string]string) []map[string]interface{} { | |
| 	var dest []map[string]interface{} | |
| 
 | |
| 	for i := range src { | |
| 		m := src[i] | |
| 		n := make(map[string]interface{}) | |
| 		for k, v := range m { | |
| 			n[k] = interface{}(v) | |
| 		} | |
| 		dest = append(dest, n) | |
| 	} | |
| 
 | |
| 	return dest | |
| } | |
| 
 | |
| /** | |
|  * 将map[string]string转成map[string]interface | |
|  */ | |
| func MapStringToInterface(src map[string]string) map[string]interface{} { | |
| 	target := make(map[string]interface{}) | |
| 	for k, v := range src { | |
| 		target[k] = interface{}(v) | |
| 	} | |
| 
 | |
| 	return target | |
| } | |
| 
 | |
| //将interface转成map[string]interface | |
| func InterfaceToMapInterface(data interface{}) (map[string]interface{}, error) { | |
| 	dataJson, err := json.Marshal(data) | |
| 
 | |
| 	if err != nil { | |
| 		return nil, err | |
| 	} | |
| 
 | |
| 	var returnData map[string]interface{} | |
| 	err = json.Unmarshal(dataJson, &returnData) | |
| 
 | |
| 	return returnData, nil | |
| } | |
| 
 | |
| //将interface转成map[string]string | |
| func InterfaceToMapString(data interface{}) (map[string]string, error) { | |
| 	dataJson, err := json.Marshal(data) | |
| 
 | |
| 	if err != nil { | |
| 		return nil, err | |
| 	} | |
| 
 | |
| 	var returnData map[string]string | |
| 	err = json.Unmarshal(dataJson, &returnData) | |
| 
 | |
| 	return returnData, nil | |
| } | |
| 
 | |
| //将interface转成[]map[string]interface | |
| func InterfaceToMapInterfaceArr(data interface{}) ([]map[string]interface{}, error) { | |
| 	dataJson, err := json.Marshal(data) | |
| 
 | |
| 	if err != nil { | |
| 		return nil, err | |
| 	} | |
| 
 | |
| 	var returnData []map[string]interface{} | |
| 	err = json.Unmarshal(dataJson, &returnData) | |
| 
 | |
| 	return returnData, nil | |
| } | |
| 
 | |
| //将interface转成[]map[string]string | |
| func InterfaceToMapStringArr(data interface{}) ([]map[string]string, error) { | |
| 	dataJson, err := json.Marshal(data) | |
| 
 | |
| 	if err != nil { | |
| 		return nil, err | |
| 	} | |
| 
 | |
| 	var returnData []map[string]string | |
| 	err = json.Unmarshal(dataJson, &returnData) | |
| 
 | |
| 	return returnData, nil | |
| } | |
| 
 | |
| /** | |
|  * 对map进行字典序排序 | |
|  * @param data map[string]string | |
|  * @2020/12/28 | |
|  * @linsen | |
|  */ | |
| func HttpBuildQuery(data map[string]string) string { | |
| 
 | |
| 	keySlice := []string{} | |
| 
 | |
| 	for k, _ := range data { | |
| 		keySlice = append(keySlice, k) | |
| 	} | |
| 	sort.Strings(keySlice) //排序字符串 | |
|  | |
| 	var query string | |
| 
 | |
| 	for _, value := range keySlice { | |
| 		if value != "" && data[value] != "" { | |
| 			query += StringJoin(value, "=", data[value], "&") | |
| 		} | |
| 	} | |
| 
 | |
| 	return strings.Trim(query, "&") | |
| } | |
| 
 | |
| /** | |
|  * 对map字典按照顺序进行拼接,并且把每个value进行类urlencode | |
|  * @param data map[string]string | |
|  * @2021/10/14 | |
|  * @wyy | |
|  */ | |
| func HttpBuildStringQuery(data map[string]string) string { | |
| 
 | |
| 	keySlice := []string{} | |
| 
 | |
| 	for k, _ := range data { | |
| 		keySlice = append(keySlice, k) | |
| 	} | |
| 	// sort.Strings(keySlice) //排序字符串 | |
|  | |
| 	var query string | |
| 
 | |
| 	for _, value := range keySlice { | |
| 		if value != "" && data[value] != "" { | |
| 			query += StringJoin(value, "=", url.QueryEscape(data[value]), "&") | |
| 		} | |
| 	} | |
| 
 | |
| 	return strings.Trim(query, "&") | |
| }
 |