Go——记录之旅

274 阅读2分钟

前言

此篇记录go的学习

(一)、工具

1、数组

如下,我们需要A数组获取到B数组相同物料的sto_amount,

arrA 
[
	map[id:eic1,material_id:a551e66da,material_name:鱿鱼须,amount:22]
	map[id:chf2,material_id:5317e73ad,material_name:笋干鸡,amount:30]
	map[id:e275,material_id:1c5437e35,material_name:田鸡,amount:45]					
]   

arrB 
[
	map[id:rfd9,material_id:a551e66da,material_name:鱿鱼须,sto_amount:10]
	map[id:opo2,material_id:5317e73ad,material_name:笋干鸡,sto_amount:20]
	map[id:r73d,material_id:1c5437e35,material_name:田鸡,sto_amount:25]					
]

一般我们只要循环两个数组匹配相同的 material_id,再赋值就可以了

如果我们只循环一个数组能否解决问题?

首先我需要把arrB构造成keyMap,我们暂时叫做 objB 吧,如下:

objB 
[
	a551e66da:map[id:rfd9,material_id:a551e66da,material_name:鱿鱼须,sto_amount:10]
	5317e73ad:map[id:opo2,material_id:5317e73ad,material_name:笋干鸡,sto_amount:20]
	1c5437e35:map[id:r73d,material_id:1c5437e35,material_name:田鸡,sto_amount:25]					
]

我们来实现下如何把arrB构造成objB

objB := this.GetKEMapByColumnFromLst("material_id",arrB)

func GetKEMapByColumnFromLst(key string, lst []map[string]interface{}) map[string]map[string]interface{} {
omp := make(map[string]map[string]interface{})
for _, ele := range lst {
	tkey := fmt.Sprint(ele[key])
	omp[tkey] = ele
}
return omp
}

循环arrA数组,根据material_id,匹配出objB[material_id],对象

objB := this.GetKEMapByColumnFromLst("material_id",arrB)

for _,item :=range arrA{
	material_id := fmt.Sprint(item["material_id"])
	bInfo := objB[material_id]
	item["call_amount"] = bInfo["sto_amount"]
}

到此,arrA数组数据

arrA 
[
	map[id:eic1,material_id:a551e66da,material_name:鱿鱼须,amount:22,call_amount:10]
	map[id:chf2,material_id:5317e73ad,material_name:笋干鸡,amount:30,call_amount:20]
	map[id:e275,material_id:1c5437e35,material_name:田鸡,amount:45,call_amount:25]					
]  

2、map数组构造成string数组

我们通常会遇到这样的问题,在sql中需要 IN('a','b','c')

但大多情况我们得到的数据是map数组[a,b,c],就需要重新构造

那我们就用上节的arrA,对id进行操作

arrA 
[
	map[id:eic1,material_id:a551e66da,material_name:鱿鱼须,amount:22,call_amount:10]
	map[id:chf2,material_id:5317e73ad,material_name:笋干鸡,amount:30,call_amount:20]
	map[id:e275,material_id:1c5437e35,material_name:田鸡,amount:45,call_amount:25]					
] 

假设我们在sql需要用到 id IN('eic1','chf2','e275')
首先需要先把id取出来,先构造成 [eic1,chf2,e275] ,再转成 'eic1','chf2','e275'

ids := this.GetFieldArrayFromLst(arrA,"id")  //得到 [eic1,chf2,e275]

func GetFieldArrayFromLst(resultLst []map[string]interface{}, fieldName string) []string {
	var rlst []string
	rlst = append(rlst, "")
	for _, ele := range resultLst {
		if nil == ele {
			continue
		}
		id := fmt.Sprint(ele[fieldName])
		if "" == id {
			continue
		}
		rlst = append(rlst, id)
	}
	return rlst
}


idStr := this.GetStrFromArray(ids)   //得到  'eic1','chf2','e275'

func GetStrFromArray(rlst []string) string {
	restr := `''`
	for _, e := range rlst {
		restr += S_SFT(`,'{0}'`, e)
	}

	if strings.HasPrefix(restr, `'',`) {
		restr = strings.Replace(restr, `'',`, ``, -1)
	}

	return restr
}

到此,已经满足我们的需求了


Create by xd on 2019/8/27 18:51:00
Recently revised in 2019/9/6 16:38:04