博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang类型检测
阅读量:5076 次
发布时间:2019-06-12

本文共 1902 字,大约阅读时间需要 6 分钟。

要求是对任意的输入类型,对其进行要求的类型的检测,防止不正确的参数输入到后续的函数中

package main import ( "fmt"    "reflect" ) func main(){
var a int=8; var b string="as" Vaild(a,"string") Vaild(b,"string") } func Vaild(params interface{},t string) bool {
var returnbool bool = false paramsType := reflect.TypeOf(params) fmt.Println(params) fmt.Println(paramsType) fmt.Println(t) //if paramsType == t {
// returnbool = true //} fmt.Println(returnbool) return returnbool }
8intstringfalseasstringstringfalse

因为输入可能为任意类型,所以用interface{},在作为函数形参时,可以接受不同类型的参数。

但是interface{}不能直接取值,只能通过reflect反射取出其中的类型或值,

但是通过reflect.TypeOf取出类型后仍然无法进行判断报错invalid operation: paramsType == t (mismatched types reflect.Type and string)

// TypeOf returns the reflection Type that represents the dynamic type of i. // If i is a nil interface value, TypeOf returns nil. func TypeOf(i interface{}) Type {
eface := *(*emptyInterface)(unsafe.Pointer(&i))	return toType(eface.typ)}

翻译过来就是:TypeOf用来动态获取输入参数接口中的值的类型,如果接口值为空就返回nil

虽然输出都是string但是反射出的实际类型还是不一样的,这里的type是反射对象类型,而不是平时具体的type,所以无法进行判断,

而为了完成我们的目标,我们还要多增加一步操作

package mainimport ("fmt"	"reflect")func main(){var a int=8;var b string="as"Vaild(a,"string")Vaild(b,"string")}func Vaild(params interface{},t string) bool {	var returnbool bool = false	ParamsType := reflect.TypeOf(params)	ParamsType_String := ParamsType.String()	fmt.Println(params)	fmt.Println(ParamsType)	fmt.Println(ParamsType_String)	fmt.Println(t)	if ParamsType_String == t {		returnbool = true	}	fmt.Println(returnbool)	return returnbool}

只需要增加一个类型转换即可完成

intstringfalseasstringstringstringtrue

这样就完成了明确要求的类型判断

这里的一个主要目的就是接口类型的理解和反射的理解应用

每个interface变量都有一个对应pair,pair中记录了实际变量的值和类型:

(value,type)

其实value是实际变量的值,type是实际变量的类型。

一个interface{}类型的变量包含了2个指针,一个指针指向值的类型,另外一个指针指向实际的值。

reflect.TypeOf和reflect.ValueOf两个对应的反射取到的数据类型是type Type和type Values,

仍然需要进一步处理才可以继续使用。

转载于:https://www.cnblogs.com/VingB2by/p/9822670.html

你可能感兴趣的文章
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>
jQuery 自定义函数
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
网卡流量检测.py
查看>>
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>
yii 1.x 添加 rules 验证url数组
查看>>
html+css 布局篇
查看>>
SQL优化
查看>>
用C语言操纵Mysql
查看>>
轻松学MVC4.0–6 MVC的执行流程
查看>>
redis集群如何清理前缀相同的key
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
获取元素
查看>>