我们知道,在Python中,判断一个变量是否为某种类型,只需要使用关键字isinstance即可:defcalc(param):ifisinstance(param,int):returnparam+1elifisinstance(param,str):returnNoneGolang作为一门静态语言,虽然在大多数情况下,变量的类型在定义的时候就已经确定了,但是不会出现一会儿是整型,一会儿是字符串的情况。但是Golang有一个类型叫做接口,它可以存储任何类型的数据。我们来看一个例子:packagemainimport("fmt")funcmain(){varparaminterface{}param=123fmt.Println("Inthebeginning,paramis:",param)param="xyz"fmt.Println("Later,paramis:",param)}运行效果如下图所示:一般情况下,我们真的不会主动给自己找麻烦,故意定义一个接口类型到处使用。但有时必须这样做。比如创建一个map,它的value可能有多种类型,这时候就必须使用interface。那么,如果我们的某个函数接收到一个接口作为参数,需要根据其中存储的不同类型的数据实现不同的逻辑,该怎么办呢?Golang中有几种方法。只打印类型如果只需要打印出界面中的数据类型,可以使用%T来实现:packagemainimport("fmt")funcmain(){varparaminterface{}param=123fmt.Printf("数据类型为:%T\n",param)}运行效果如下图所示:如果需要将这个类型存储在另一个变量中,也很容易:packagemainimport("fmt")funcmain(){varparaminterface{}param=123param_type:=fmt.Sprintf("%T",param)ifparam_type=="int"{//注意这里的类型都是字符串的形式fmt.Println("Confirmedtobeaninteger!")}}运行效果如下图所示:multiple判断如果接口中的数据可能有多种类型,每种类型有不同的处理方案,那么可以使用开关类型语法:packagemainimport("fmt")funcmain(){varparaminterface{}param=123switchparam.(type){caseint://注意这里的类型都是类型本身fmt.Println("数据是整数!")casestring:fmt.Println("数据是一个字符串g!")default:fmt.Println("Othertypes!")}}运行效果如下图所示:但需要注意的是param.(type)语法只能用在switch...类型,单独使用会报错。判断是不是某种类型就可以如果我只需要判断接口中的数据是否是某种类型,那么有更简单的方法:packagemainimport("fmt")funcmain(){varparaminterface{}param=123_,yes:=param.(float64)ifyes{fmt.Println("是float64的类型")}else{fmt.Println("不是float64的类型")}}运行效果如下图所示:其中其中,param.(具体类型)返回两个数据,第一个数据是接口中的数据,第二个数据是bool类型,如果接口中的数据是具体类型则返回true,否则返回false。
