golang 多維雜湊(map,hashmap)使用心得

來源:互聯網
上載者:User

  有些情境使用多維雜湊來儲存資料,很簡單粗暴好用。這裡記錄一下。

如下是三維雜湊的簡單,建議層數不要太多,否則時間久了,自己寫的代碼都不認識。

是三維雜湊在記憶體的儲存形式,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}

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.