1. 程式人生 > >golang中xorm包使用map[string]interface{}

golang中xorm包使用map[string]interface{}

前言:
許久沒發個人部落格了,最近有點忙,很是懷念以前有時間寫部落格的日子。最近做各種後臺服務,寫了N個rest介面,其中有相當一部分是和mysql掛鉤的,這時候就使用起了golang的xorm包。特意記錄下使用時候用到map[string]interface{}的場景。

一、map[string]interface{}的使用點:
1、去掉加密操作後,一般rest介面使用的資料格式大多為json格式,json格式解碼的時候可以解碼到map[string]interface{}中。
2、資料庫查詢操作可以使用map[string]interface{}或者[]map[string]interface{}獲取查詢結果。
3、資料庫更新操作可以使用map[string]interface{}更新記錄。

二、優點:
1、json解碼的時候可以用統一的map[string]interface{}結構去獲取json內容。rest返回值也可以直接將map[string]interface{}編碼為相應的json格式。這樣可以省去很多資料結構的定義。
2、當mysql中有些欄位很詭異,欄位值本來就有雙引號和json格式內容的時候,定義一個結構使用json包解碼有時候會導致其他欄位解析不出來,這時候如果使用map[string]interface{}來解析mysql返回的欄位,則沒這方面的問題。
3、當需求變化巨快,資料變化很頻繁的時候,可能有時候今天定義的rest返回值和入參明天就變化的時候,使用map[string]interface{}在做適配的時候會非常快。
4、從資料庫中獲取的很多欄位都要做類似的處理的時候,使用map[string]interface{}有時候可以省去很多程式碼,因為如果相同型別的欄位可以做相同的處理,那麼寫一個迴圈就可以了,和反射一個道理。

三、缺點:
1、interface{}的資料型別,在使用的時候,需要斷言。
2、只能用在查詢和更新的時候。
3、如果返回的欄位和資料庫中的欄位名字不一致,那麼中間需要對map進行操作。
4、資料庫返回數值型別的為int64,字串型別的為[]uint8,很多時候需要做型別轉換,這就是為什麼網上有那麼多人在說[]uint8和string型別轉換效率啥的,應該就是用map[string]interface{}去作為統一的json解碼入口或者mysql資料賦值。
5、開發介面文件需要些的特別好,否則後續開發者,其實很難知道入參和出錯。因為可能入參出參都是定義一個map[string]interface{}

總結:
對於頻繁需要改動的功能,可以使用map[string]interface{},對於比較穩定的介面,資料結構最好定義清晰些。