<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      GoLang structTag說明

      在處理json格式字符串的時候,經常會看到聲明struct結構的時候,屬性的右側還有小米點括起來的內容。形如

      type User struct {
          UserId   int    `json:"user_id" bson:"user_id"`
          UserName string `json:"user_name" bson:"user_name"`
      }
      

       

      struct成員變量標簽(Tag)說明

      要比較詳細的了解這個,要先了解一下golang的基礎,在golang中,命名都是推薦都是用駝峰方式,并且在首字母大小寫有特殊的語法含義:包外無法引用。但是由經常需要和其它的系統進行數據交互,例如轉成json格式,存儲到mongodb啊等等。這個時候如果用屬性名來作為鍵值可能不一定會符合項目要求。

      所以呢就多了小米點的內容,在golang中叫標簽(Tag),在轉換成其它數據格式的時候,會使用其中特定的字段作為鍵值。例如上例在轉成json格式:

       

      u := &User{UserId: 1, UserName: "tony"}
      j, _ := json.Marshal(u)
      fmt.Println(string(j))
      // 輸出內容:{"user_id":1,"user_name":"tony"}
      

       如果在屬性中不增加標簽說明,則輸出:

      {"UserId":1,"UserName":"tony"}

       

      可以看到直接用struct的屬性名做鍵值。

      其中還有一個bson的聲明,這個是用在將數據存儲到mongodb使用的。

       

      struct成員變量標簽(Tag)獲取

      那么當我們需要自己封裝一些操作,需要用到Tag中的內容時,如何去獲取呢?這邊可以使用反射包(reflect)中的方法來獲取:

      t := reflect.TypeOf(u)
      field := t.Elem().Field(0)
      fmt.Println(field.Tag.Get("json"))
      fmt.Println(field.Tag.Get("bson"))
      

       完整代碼如下:

      package main
       
      import (
          "encoding/json"
          "fmt"
          "reflect"
      )
       
      func main() {
          type User struct {
              UserId   int    `json:"user_id" bson:"user_id"`
              UserName string `json:"user_name" bson:"user_name"`
          }
          // 輸出json格式
          u := &User{UserId: 1, UserName: "tony"}
          j, _ := json.Marshal(u)
          fmt.Println(string(j))
          // 輸出內容:{"user_id":1,"user_name":"tony"}
       
          // 獲取tag中的內容
          t := reflect.TypeOf(u)
          field := t.Elem().Field(0)
          fmt.Println(field.Tag.Get("json"))
          // 輸出:user_id
          fmt.Println(field.Tag.Get("bson"))
          // 輸出:user_id
      

       

      beego的ORM中也通過tag來定義參數的。

       

      package main
      
      import (
         "fmt"
         "reflect"
      )
      
      type Job struct {
         AlarmStatus      *string        `json:"alarm_status" name:"alarm_status"`
         CPUTopology      string        `json:"cpu_topology" name:"cpu_topology"`
      }
      
      
      func main(){
         a := "abc"
         s := Job{&a,"hello"}
         st := reflect.TypeOf(s)
         field := st.Field(1)
         fmt.Println(field.Tag.Get("json"), field.Tag.Get("name"))
      }
      

       

      package main
      import (
          "fmt"
          "reflect" // 這里引入reflect模塊
      )
      
      type User struct {
          Name   string "user name" //這引號里面的就是tag
          Passwd string "user passsword"
      }
      
      func main() {
          user := &User{"chronos", "pass"}
          s := reflect.TypeOf(user).Elem() //通過反射獲取type定義
          for i := 0; i < s.NumField(); i++ {
              fmt.Println(s.Field(i).Tag) //將tag輸出出來
          }
      }
      

       

      posted @ 2017-09-28 12:13  曾先森在努力  閱讀(7052)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产国拍精品av在线观看| 无码综合天天久久综合网| 东京热大乱系列无码| 成人精品动漫一区二区| 亚洲中文一区二区av| 欧洲码亚洲码的区别入口| 西乌珠穆沁旗| 国产成人高清精品亚洲| 亚洲日韩AV秘 无码一区二区| 久久国产福利播放| 免费十八禁一区二区三区| 亚洲国产精品人人做人人爱| 亚洲精品一区二区三区大桥未久| 亚洲人妻av伦理| 亚洲国内精品一区二区| 欧洲性开放老太大| 五月天免费中文字幕av| 国产精品中出一区二区三区| 久久天天躁夜夜躁狠狠| 国产成人精品无人区一区| 岛国中文字幕一区二区| 日韩av综合免费在线| 亚洲精品乱码久久观看网| 国产精品老年自拍视频| 色偷偷女人的天堂亚洲网| 四虎永久地址www成人| 国产仑乱无码内谢| 色噜噜狠狠成人综合| 三级网站视频在在线播放| 国产激情一区二区三区不卡| 精品国产乱码久久久久乱码| 国产片av在线观看国语| 97人人添人人澡人人澡人人澡| 亚洲精品国模一区二区| 国产精品熟女亚洲av麻豆| 亚洲日韩AV秘 无码一区二区| 国产成人精品久久一区二区| 东平县| 国产suv精品一区二区四| 日韩AV高清在线看片| 同性男男黄gay片免费|