本篇内容介绍了“go语言反射指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
Go 语言中的反射与其他语言有比较大的不同,Golang 中的发射主要涉及到两个基本概念 Type 和 Value,它们也是 Go 语言包中 reflect 包 里最重要的两个类型。
在 Golang 中对所有 接口 进行反射,都可以得到一个包含 Type 和 Value 的信息结构。顾名思义,Type 主要表达的是被反射的这个变量本身的类型信息,而 Value 则为该变量实例本身的信息。
Golang 中的反射主要有两个作用,即,获取类型信息和获取值类型。
利用反射我们可以:
语法:
reflect.TypeOf(x)
作用:
获取数据类型
用法:
package mainimport ( "fmt" "reflect")func main() { var x = 3.4 var str = "Hello World" fmt.Println("x type =", reflect.TypeOf(x)) fmt.Println("str type =", reflect.TypeOf(str))}
语法:
reflect.TypeOf(varname)
作用:
可以获取该变量对应的值。
用法:
package mainimport ( "fmt" "reflect")func main() { var x = 1024 var str = "Hello World" fmt.Println("x type =", reflect.TypeOf(x)) fmt.Println("str type =", reflect.TypeOf(str))}
语法:
reflect.TypeOf(varname).Kind()
作用:
使用 reflect.TypeOf 传入我们要获取的变量,即可以获取该变量的类型,同时使用 Kind 方法可以获取该类型的详细信息
用法:
package mainimport ( "fmt" "reflect")func main() { var x = 1024 var str = "Hello World" typeX := reflect.TypeOf(x) typeStr := reflect.TypeOf(str) typexKind := typeX.Kind() typeStrKind := typeStr.Kind() fmt.Println("x type =", typeX, ", Kind =", typexKind) fmt.Println("str type =", typeStr, ", Kind =", typeStrKind)}
语法:
reflect.ValueOf(varname)
作用:
使用 reflect.ValueOf 传入我们要获取的变量,可以获取该变量的值信息
用法:
package mainimport ( "fmt" "reflect")func main() { var x = 1024 var str = "Hello World" valueX := reflect.ValueOf(x) valueStr := reflect.ValueOf(str) fmt.Println("valueX =", valueX) fmt.Println("valueStr =", valueStr)}
语法:
reflect.ValueOf(varname).Elem()
作用:
使用 reflect.ValueOf 传入我们要获取的变量,可以获取该变量的值信息
用法:
package mainimport ( "fmt" "reflect")func main() { var x = 1024 var str = "Hello World" valueX := reflect.ValueOf(x) valueStr := reflect.ValueOf(str) fmt.Println("valueX =", valueX) fmt.Println("valueStr =", valueStr) valueElemX := valueX.Elem() valueElemStr := valueStr.Elem() fmt.Println("valueElemX =", valueElemX) fmt.Println("valueElemStr =", valueElemStr)}
语法:
personValue := reflect.ValueOf(p)infoFunc := personValue.MethodByName("Info")infoFunc.Call([]reflect.Value{})
作用:
通过 reflect.ValueOf 获取结构体的值信息,再次使用结构体值信息的 MethodByName 获取结构体的方法,最后使用 Call 方法可以实现调用结构体的方法
用法:
import ( "fmt" "reflect")type Student struct { Name string Age int Score float64}func (s Student)Info(){ fmt.Println("Name =", s.Name, "Age =", s.Age, "Score =", s.Score)}func main() { var p = Student{ Name:"Jim", Age:10, Score:99, } personValue := reflect.ValueOf(p) infoFunc := personValue.MethodByName("Info") infoFunc.Call([]reflect.Value{})}
下面这段代码使用了TypeOf,来处理结构体里面包含的数组、时间类型的值。可以作为一个通用的反射方式使用.
func reflect(o interface{}) error { re := reflect.TypeOf(o).Elem() rv := reflect.ValueOf(o).Elem() //判断是否为结构体 if re.Kind() == reflect.Struct { for i := 0; i < re.NumField(); i++ { f := re.Field(i) name := f.Name fmt.Printf("field name %v :" ,name) //获取结构体其中一个字段的值 v := rv.FieldByName(name) if v.Kind() == reflect.Struct { //处理时间类型 if v.Type().ConvertibleTo(reflect.TypeOf(time.Time{})) { fmt.Printf("field name : %v type of time" ,name) continue } //判断是否为空 if !v.IsNil() { fmt.Printf("field name : %v is empty" ,name) continue } //TODO 此处没有业务逻辑可以补充 } //处理数组类型 if v.Kind() == reflect.Slice { for j := 0; j < v.Len(); j++ { //判断数组里面的对象是否为指针类型 if reflect.TypeOf(v.Index(j).Interface()).Kind() == reflect.Ptr { fmt.Printf("field name : %v type of Ptr" ,name) continue } } } } } return nil}
“go语言反射指的是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://www.xuebuyuan.com/3289899.html