本篇内容介绍了“go语言反射指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

成都创新互联公司长期为近千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为七星关区企业提供专业的网站制作、成都做网站,七星关区网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
反射的解释
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://www.scyingshan.cn/article/gceghd.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 