您的位置:首页 > 编程语言 > Go语言

golang之反射和断言的具体使用

2019-11-05 18:07 2231 查看

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 反射 断言