最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go json數(shù)據(jù)轉(zhuǎn)發(fā)的實現(xiàn)代碼

 更新時間:2019年09月10日 08:25:41   作者:shanyin  
這篇文章主要介紹了go json數(shù)據(jù)轉(zhuǎn)發(fā)的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

案例

例如,有個 GET 接口,可以批量獲取用戶信息👇

> curl 'http://localhost:8080/user/1,2,3'
[
  {
    "user_id":1,
    "other_suff":...
  },
  {
    "user_id":2,
    "other_suff":...
  },
  {
    "user_id":3,
    "other_suff":...
  }
]

同時,我們要將用戶信息和他們的某些訂單信息放在一起,組裝成為👇的接口,滿足其他業(yè)務(wù)需求。

[
  {
    "user_info":{
      "user_id":1,
      "other_suff":...
    },
    "order_info":{
      "order_id":1,
      "user_id":1,
      "other_suff":...
    }
  },
  {
    "user_info":{
      "user_id":2,
      "other_suff":...
    },
    "order_info":{
      "order_id":2,
      "user_id":2,
      "other_suff":...
    }
  },
  {
    "user_info":{
      "user_id":3,
      "other_suff":...
    },
    "order_info":{
      "order_id":3,
      "user_id":3,
      "other_suff":...
    }
  }
]

分析

解決這個問題很簡單:把user信息和order信息的json用工具解析得到結(jié)構(gòu)體,然后調(diào)用他們的接口得到數(shù)據(jù),根據(jù)id關(guān)聯(lián)和拼裝,最后返回。

這樣的做法存在的一個問題是,代碼解析了user和order的完整結(jié)構(gòu)。如果user接口返回的用戶信息增加了字段,我們這里的結(jié)構(gòu)體要同步更新,否則我們給出的數(shù)據(jù)就是不完整的。(這可能是很痛苦的,你要求別的團(tuán)隊加字段,得排期...)

其實我們作為數(shù)據(jù)的“中間商”,只關(guān)心user接口json里的 user_id ,我們使用這個字段關(guān)聯(lián)order數(shù)據(jù)。對于user信息里的 other_suff 或者其他數(shù)據(jù),我們并不關(guān)心,只要保證完整傳出去就好了。

根據(jù) https://golang.org/pkg/encoding/json/#Unmarshal ,可以知道直接丟一個 map[string]interface{} 給 json.Unmarshal 也可以正常解析的,于是我們可以寫出比較通用的透傳代碼。

type Content []map[string]interface{}

func (c Content) GetByFieldName(name string, defaultVal interface{}) infterface{} {
  for _, item := range c {
    val, ok := item[name]
    if !ok {
      continue
    }
    if val == nil {
      return defaultVal
    }
    return val
  }
  return defaultVal
}

func getUserContentByIDs(ids []int) Content {
  ...
  var c Content
  err := json.Unmarshal(jsonData, &c) 
  ...
  return c
}

func getOrderContentByUserIDs(ids []int) Content {.../*同上*/}

func Handler(userIDs []int) []Combine {

  users := getUserContentByIDs(userIDs)
  orders := getOrderContentByUserIDs(userIDs)

  // 這里假設(shè)用戶和訂單是一對一的關(guān)系
  ret := make([]Combine, 0, len(users))
  for _, u := range users {
    for _, o := range orders {
      userID := u.GetByFieldName("user_id", 0) 
      orderUserID := o.GetByFieldName("user_id", 0)
      if userID != 0 && userID == orderUserID {
        ret = append(ret, Combine{
          UserInfo: u,
          OrderInfo: o,
        })
        break
      }
    }
  }
  return ret
}

P.S. 在上面的例子中,每次查詢Content都要遍歷數(shù)組。如果數(shù)據(jù)量大或者查詢頻繁,可以在初始化Content的時候,根據(jù)item的唯一標(biāo)標(biāo)識,再給Content根據(jù)封裝一個map,提高查詢效率。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP

    Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP

    這篇文章主要為大家介紹了Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 一文帶你入門Go語言中定時任務(wù)庫Cron的使用

    一文帶你入門Go語言中定時任務(wù)庫Cron的使用

    在平時的開發(fā)需求中,我們經(jīng)常會有一些重復(fù)執(zhí)行的操作需要觸發(fā)執(zhí)行,說白了就是定時任務(wù)。這篇文章主要給大家介紹一下如何在go項目中實現(xiàn)一個crontab功能,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-08-08
  • Golang使用JWT進(jìn)行認(rèn)證和加密的示例詳解

    Golang使用JWT進(jìn)行認(rèn)證和加密的示例詳解

    JWT是一個簽名的JSON對象,通常用作Oauth2的Bearer?token,JWT包括三個用.分割的部分。本文將利用JWT進(jìn)行認(rèn)證和加密,感興趣的可以了解一下
    2023-02-02
  • Go語言里的new函數(shù)用法分析

    Go語言里的new函數(shù)用法分析

    這篇文章主要介紹了Go語言里的new函數(shù)用法,實例分析了new函數(shù)的功能及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • golang并發(fā)編程的實現(xiàn)

    golang并發(fā)編程的實現(xiàn)

    這篇文章主要介紹了golang并發(fā)編程的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Go語言生成素數(shù)的方法

    Go語言生成素數(shù)的方法

    這篇文章主要介紹了Go語言生成素數(shù)的方法,實例分析了Go語言生成素數(shù)的技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言入門之基礎(chǔ)語法和常用特性解析

    Go語言入門之基礎(chǔ)語法和常用特性解析

    這篇文章主要給大家講解了Go語言的基礎(chǔ)語法和常用特性解析,比較適合入門小白,文中通過代碼示例介紹的非常詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • Go語言中slice的用法實例分析

    Go語言中slice的用法實例分析

    這篇文章主要介紹了Go語言中slice的用法,實例分析了slice的功能及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Golang中Delve版本太低無法Debug的問題

    Golang中Delve版本太低無法Debug的問題

    這篇文章主要介紹了Golang中Delve版本太低無法Debug的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 使用Golang快速構(gòu)建出命令行應(yīng)用程序

    使用Golang快速構(gòu)建出命令行應(yīng)用程序

    在日常開發(fā)中,大家對命令行工具(CLI)想必特別熟悉了,如果說你不知道命令工具,那你可能是個假開發(fā)。每天都會使用大量的命令行工具,例如最常用的Git、Go、Docker等,這篇文章主要介紹了使用Golang快速構(gòu)建出命令行應(yīng)用程序,需要的朋友可以參考下
    2023-02-02

最新評論

前郭尔| 桂东县| 西青区| 台安县| 昆明市| 余庆县| 新源县| 临沂市| 汉川市| 霍城县| 高碑店市| 临湘市| 玛纳斯县| 宁明县| 临夏市| 聂拉木县| 江山市| 邻水| 吴桥县| 淳安县| 桦川县| 于都县| 花垣县| 梅州市| 宁明县| 绥江县| 电白县| 封开县| 汉川市| 屯留县| 灵山县| 东辽县| 顺义区| 襄樊市| 定远县| 栾川县| 黄浦区| 兴城市| 广南县| 虹口区| 文昌市|