91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang中反射和斷言如何使用

發布時間:2021-06-17 14:37:25 來源:億速云 閱讀:353 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關golang中反射和斷言如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

1. 反射

反射這個概念絕大多數語言都有,比如Java,PHP之類,golang自然也不例外,反射其實程序能夠自描述和自控制的一類機制。

比如,通過PHP的反射,你可以知道一個類有什么成員,有什么方法。而golang,也能夠通過官方自帶的reflect包來了解各種變量類型及其信息。

下面我們通過一個例子查看反射的基本用法。

話不多說,直接貼代碼:

package main

import (
  "fmt"
  "reflect"
)

type Order struct {
  ordId   int `json:"order_id" validate:"required"`
  customerId string  `json:"customer_id" validate:"required"`
  callback func() `json:"call_back" validate:"required"`
}

func reflectInfo(q interface{}) {
  t := reflect.TypeOf(q)
  v := reflect.ValueOf(q)
  fmt.Println("Type ", t)
  fmt.Println("Value ", v)
  for i := 0; i < v.NumField(); i = i + 1 {
    fv := v.Field(i)
    ft := t.Field(i)
    tag := t.Field(i).Tag.Get("json")
    validate := t.Field(i).Tag.Get("validate")
    switch fv.Kind() {
    case reflect.String:
      fmt.Printf("The %d th %s types: %s, valuing: %s, struct tag: %v\n", i, ft.Name, "string", fv.String(), tag + " " + validate)
    case reflect.Int:
      fmt.Printf("The %d th %s types %s, valuing %d, struct tag: %v\n", i, ft.Name, "int", fv.Int(), tag + " " + validate)
    case reflect.Func:
      fmt.Printf("The %d th %s types %s, valuing %v, struct tag: %v\n", i, ft.Name, "func", fv.String(), tag + " " + validate)
    }
  }

}
func main() {
  o := Order{
    ordId:   456,
    customerId: "39e9e709-dd4f-0512-9488-a67c508b170f",
  }
  reflectInfo(o)
}

首先,我們用reflect.TypeOf(q)和reflect.ValueOf(q)獲取了結構體order的類型和值,然后我們再從循環里對它的成員進行一個遍歷,并將所有成員的名稱和類型打印了出來。這樣,一個結構體的所有信息就都暴露在我們面前。

2.斷言

Go語言里面有一個語法,可以直接判斷是否是該類型的變量: value, ok = element.(T),這里value就是變量的值,ok是一個bool類型,element是interface變量,T是斷言的類型。

如果element里面確實存儲了T類型的數值,那么ok返回true,否則返回false。

package main

import (
  "fmt"
)

type Order struct {
  ordId   int
  customerId int
  callback func()
}

func main() {
  var i interface{}
  i = Order{
    ordId:   456,
    customerId: 56,
  }
  value, ok := i.(Order)
  if !ok {
    fmt.Println("It's not ok for type Order")
    return
  }
  fmt.Println("The value is ", value)
}

輸出:

The value is  {456 56 <nil>}

常見的還有用switch來斷言:

package main

import (
  "fmt"
)

type Order struct {
  ordId   int
  customerId int
  callback func()
}

func main() {
  var i interface{}
  i = Order{
    ordId:   456,
    customerId: 56,
  }
  switch value := i.(type) {
    case int:
      fmt.Printf("It is an int and its value is %d\n", value)
    case string:
      fmt.Printf("It is a string and its value is %s\n", value)
    case Order:
      fmt.Printf("It is a Order and its value is %v\n", value)
    default:
      fmt.Println("It is of a different type")
    }
}

輸出:

It is a Order and its value is {456 56 <nil>}

看完上述內容,你們對golang中反射和斷言如何使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

观塘区| 秦皇岛市| 汝南县| 罗甸县| 泰宁县| 辽宁省| 湖北省| 西乌| 宁河县| 会昌县| 永仁县| 景泰县| 上思县| 兴宁市| 合水县| 弥渡县| 垫江县| 桓仁| 营山县| 从化市| 永清县| 濮阳市| 修武县| 安平县| 西充县| 辽宁省| 宁明县| 宜都市| 曲阜市| 如皋市| 遂宁市| 虎林市| 广安市| 高台县| 抚顺县| 江门市| 临澧县| 喀喇| 凤山市| 霞浦县| 尚志市|