go语言的反射是什么意思
这篇文章主要介绍“go语言的反射是什么意思”,在日常操作中,相信很多人在go语言的反射是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言的反射是什么意思”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
创新互联公司致力于互联网网站建设与网站营销,提供成都网站制作、成都网站设计、网站开发、seo优化、网站排名、互联网营销、重庆小程序开发、公众号商城、等建站开发,创新互联公司网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。
反射的解释
Go 语言中的反射与其他语言有比较大的不同,Golang 中的发射主要涉及到两个基本概念 Type 和 Value,它们也是 Go 语言包中 reflect 包 里最重要的两个类型。
在 Golang 中对所有 接口 进行反射,都可以得到一个包含 Type 和 Value 的信息结构。顾名思义,Type 主要表达的是被反射的这个变量本身的类型信息,而 Value 则为该变量实例本身的信息。
反射的作用
Golang 中的反射主要有两个作用,即,获取类型信息和获取值类型。
利用反射我们可以:
动态解析 函数的封装 ...
反射获取数据类型
语法:
reflect.TypeOf(x)
作用:
获取数据类型
用法:
package main
import (
"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))
}
反射获取Type
语法:
reflect.TypeOf(varname)
作用:
可以获取该变量对应的值。
用法:
package main
import (
"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))
}
反射获取Type
语法:
reflect.TypeOf(varname).Kind()
作用:
使用 reflect.TypeOf 传入我们要获取的变量,即可以获取该变量的类型,同时使用 Kind 方法可以获取该类型的详细信息
用法:
package main
import (
"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 main
import (
"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 main
import (
"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语言的反射是什么意思”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
文章名称:go语言的反射是什么意思
文章地址:http://scyanting.com/article/gdgpoj.html