golang类型检测
要求是对任意的输入类型,对其进行要求的类型的检测,防止不正确的参数输入到后续的函数中 package main 8 int string false as string string false 因为输入可能为任意类型,所以用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. eface := *(*emptyInterface)(unsafe.Pointer(&i)) return toType(eface.typ) } 翻译过来就是:TypeOf用来动态获取输入参数接口中的值的类型,如果接口值为空就返回nil 虽然输出都是string但是反射出的实际类型还是不一样的,这里的type是反射对象类型,而不是平时具体的type,所以无法进行判断, 而为了完成我们的目标,我们还要多增加一步操作 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) 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 } 只需要增加一个类型转换即可完成 int string false as string string string true 这样就完成了明确要求的类型判断 这里的一个主要目的就是接口类型的理解和反射的理解应用 每个interface变量都有一个对应pair,pair中记录了实际变量的值和类型: (value,type) 其实value是实际变量的值,type是实际变量的类型。 一个interface{}类型的变量包含了2个指针,一个指针指向值的类型,另外一个指针指向实际的值。 reflect.TypeOf和reflect.ValueOf两个对应的反射取到的数据类型是type Type和type Values, 仍然需要进一步处理才可以继续使用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |