golang 多维哈希(map,hashmap)使用心得

栏目: 数据库 · 发布时间: 6年前

内容简介:有些场景使用多维哈希来存储数据,很简单粗暴好用。这里记录一下。如下是三维哈希的简单示意图,建议层数不要太多,否则时间久了,自己写的代码都不认识。

有些场景使用多维哈希来存储数据,很简单粗暴好用。这里记录一下。

如下是三维哈希的简单示意图,建议层数不要太多,否则时间久了,自己写的代码都不认识。

golang 多维哈希(map,hashmap)使用心得

下图是三维哈希在内存的存储形式,hashmap嵌套了3层。图里一层数组存放hashcode和链表头节点指针,每个节点里面都存放一个数组,数组存放下一层hashcode和下一层链表指针。(抱歉没有将哈希分桶链表完整画出来,本图重点是哈希嵌套)

golang 多维哈希(map,hashmap)使用心得

这个数据结构我是用来解析保存不同设备的配置,每个设备有两个配置文件。当新来一个该设备的数据(base64加密后的json序列化字符串),通过这个三维哈希层层解析,返回给用户直观的表象。这里不谈业务,只谈如何暴力存,暴力解。

/*****************************************************************************
   结 构 名  : StringStu
   功能描述  : 设备string文件数据结构
*****************************************************************************/
type StringStu struct {
	Cat_name    string      `json:"cat_name,omitempty"`
	Dev_name    string      `json:"dev_name,omitempty"`
	Pid         string      `json:"pid,omitempty"`
	Error       interface{} `json:"error,omitempty"`
	Intfs       interface{} `json:"intfs,omitempty"`
	Vendor_name string      `json:"vendor_name,omitempty"`
}

/*****************************************************************************
   结 构 名  : 产品string文件相关处理
   功能描述  :
*****************************************************************************/
func GetAllProductString() (Slice []ProfileSuidsStu) {
	StringStu := ReadStringFile()
	for _, StringOne := range StringStu {
		LoadDevStrings2Cache(StringOne.Pid, libf.StructToJsonStringOne(StringOne.Intfs))
	}
	return
}

func ReadStringFile() []StringStu {
	var file string = ""
	var StringSlice = make([]StringStu, 0)
	file = libf.KeyfileT(file).GetFileName("strings.json")

	Byte, Error := ioutil.ReadFile(file)
	if Error != nil {
		prnLog.LogPrint(libf.LOG_ERROR, 0, false, false, "", "ReadFile error", Error)
		return nil
	}

	msg, ret := libf.ParseJsonByStructMsg(Byte, &StringSlice)
	return StringSlice
}

/*****************************************************************************
   结 构 名  : StringIntfsStu
   功能描述  : 设备string文件,设备Intfs属性
*****************************************************************************/
type StringsIntfsStu struct {
	Name   string            `json:"name,omitempty"`   //字段的中文名称,例如:电量,背景灯光
	Unit   string            `json:"unit,omitempty"`   //单元,例如温度°C
	Values map[string]string `json:"values,omitempty"` //字段值对应的中文枚举,例如:0是关,1是开
}

type ParamAttr = map[string]StringsIntfsStu

var ProductStrings = make(map[string](ParamAttr), 0)

/*****************************************************************************
* \author      pxx
* \date        2018/08/25
* \brief		将所有设备的strings配置,载入一个三维哈希中。
			一维哈希是ProductStrings,key为pid,
			二维哈希是ParamAttr,key为字段英文名称,
			三维哈希是StringIntfsStu结构体内的Values,key为字段的值
* \param[in]
* \param[out]
* \return
* \ingroup
* \remarks
******************************************************************************/
func LoadDevStrings2Cache(pid, String string) {
	var (
		keyListString map[string]interface{} = make(map[string]interface{}, 0)
		_param_attr                          = make(ParamAttr, 0)
	)
	ProductStrings[pid] = _param_attr
	msg, ret := libf.ParseJsonByStructMsg([]byte(String), &keyListString)
    
	for key, value := range keyListString {
		var string1 StringsIntfsStu //注意作用域

		msg, ret = libf.ParseJsonByStructMsg([]byte(libf.StructToJsonStringOne(value)), &string1)
		if ret != libf.Success {
			prnLog.LogPrint(libf.LOG_DEBUG, 0, false, false, "msg=%v,ret=%v", msg, ret)
			continue
		}
		_param_attr[key] = string1
	}
}

上面的代码是粗暴的将所有设备的配置文件存入内存,下面则是根据这个三维哈希去解析数据。

/*****************************************************************************
* \author      pxx
* \date        2018/08/27
* \brief	将json序列化的无结构数据,映射为结构化数据
* \param[in]
* \param[out]
* \return
* \ingroup
* \remarks  开源代码说明:https://www.jb51.net/article/73996.htm
******************************************************************************/
func FormatUploadData(StringData string) (StructData StructUploadDataStu) {
	StructData.Did = gojson.Json(StringData).Get("did").Tostring()
	StructData.Pid = gojson.Json(StringData).Get("pid").Tostring()

	for k, v := range ProductProfile[StructData.Pid] { //k是字段名称,v是这个字段的子属性
		value := gojson.Json(StringData).Get(k).Tostring()

		//根据设备每个字段的不同属性,来映射对应的中文名称,枚举值,字符串值还有整数值
		switch v.In[0] {
		case 1, 3: //1表示枚举,2表示是连续型的参数,3 string
			StructData.Data += ProductStrings[StructData.Pid][k].Name + ":" + ProductStrings[StructData.Pid][k].Values[value] + ",  "

		case 2:
			StructData.Data += ProductStrings[StructData.Pid][k].Name + ":" + value + ",  "

		default:

		}
	}
	return
}


以上所述就是小编给大家介绍的《golang 多维哈希(map,hashmap)使用心得》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计沟通十器

设计沟通十器

Daniel M. Brown / 樊旺斌 / 机械工业出版社 / 2008-12 / 49.00元

本书提供了网站设计时所需的可交付文档资料包括:概念模型,站点地图,可用性报告等,这些文档资料是设计人员和客户进行交流的主要工具。本书深入讨论了文档推介和风险规避技巧,向你展示了如何将文档资料按要求制作成有效的交流工具。 本书内容全面,结构清晰,讲解详细。可作为网站设计人员的参考用书。 关于网站设计的多数讨论好像都着眼于流程的创建,然而,要想把概念变为现实,需要一整套强大的可交付文档资料......一起来看看 《设计沟通十器》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具