zoukankan      html  css  js  c++  java
  • golang类型检测

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

    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
    }
    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.
    // 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 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,

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

  • 相关阅读:
    Deep learning:三十八(Stacked CNN简单介绍)
    机器学习&数据挖掘笔记_11(高斯过程回归)
    Deep learning:三十九(ICA模型练习)
    机器学习&数据挖掘笔记_9(一些svm基础知识)
    机器学习&数据挖掘笔记_10(高斯过程简单理解)
    本人部分博客导航(ing...)
    算法设计和数据结构学习_3(《数据结构和问题求解》part2笔记)
    Deep learning:三十七(Deep learning中的优化方法)
    C++笔记(2):《数据结构和问题求解》part1笔记
    算法设计和数据结构学习_4(《数据结构和问题求解》part4笔记)
  • 原文地址:https://www.cnblogs.com/VingB2by/p/9822670.html
Copyright © 2011-2022 走看看