有些情境使用多維雜湊來儲存資料,很簡單粗暴好用。這裡記錄一下。
如下是三維雜湊的簡單,建議層數不要太多,否則時間久了,自己寫的代碼都不認識。
是三維雜湊在記憶體的儲存形式,hashmap嵌套了3層。圖裡一層數組存放hashcode和鏈表前端節點指標,每個節點裡面都存放一個數組,數組存放下一層hashcode和下一層鏈表指標。(抱歉沒有將雜湊分桶鏈表完整畫出來,本圖重點是雜湊嵌套)
這個資料結構我是用來解析儲存不同裝置的配置,每個裝置有兩個設定檔。當新來一個該裝置的資料(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"` //單元,例如溫度°CValues map[string]string `json:"values,omitempty"` //欄位值對應的中文枚舉,例如:0是關,1是開}type ParamAttr = map[string]StringsIntfsStuvar 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_attrmsg, 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 stringStructData.Data += ProductStrings[StructData.Pid][k].Name + ":" + ProductStrings[StructData.Pid][k].Values[value] + ", "case 2:StructData.Data += ProductStrings[StructData.Pid][k].Name + ":" + value + ", "default:}}return}