刚开始接触golang,可能对interface的使用有些迷惑,尤为在有些资料里,介绍得更是云里雾里,让人搞不清楚。本文尝试从类型转换的角度来解析interface,但愿对你们能有所帮助。很少说,先上代码。golang
package main import ( "fmt" ) func main() { var general interface{} general = 6.6 type_cast(general) general = 2 type_cast(general) } func type_cast(general interface{}) { switch general.(type) { case int : fmt.Println("the general type is int") newInt, ok := general.(int) check_convert(ok) fmt.Println("newInt 的值原本是", newInt) newInt += 2 fmt.Println("加2后,结果是", newInt) newInt -= 6 fmt.Println("接着减6后,结果是", newInt) newInt *= 4 fmt.Println("而后乘4,结果是", newInt) newInt /= 3 fmt.Println("最后除3,结果是", newInt) fmt.Println() fmt.Println() case float32: fmt.Println("the general type is float32") newFloat32, ok := general.(float32) check_convert(ok) fmt.Println("newFloat32 的值原本是", newFloat32) newFloat32 += 2.0 fmt.Println("加2.0后,结果是", newFloat32) newFloat32 -= 6.0 fmt.Println("接着减6.0后,结果是", newFloat32) newFloat32 *= 4.0 fmt.Println("而后乘4.0,结果是", newFloat32) newFloat32 /= 3.0 fmt.Println("最后除3.0,结果是", newFloat32) fmt.Println() fmt.Println() case float64: fmt.Println("the general type is float64") newFloat64, ok := general.(float64) check_convert(ok) fmt.Println("newFloat64 的值原本是", newFloat64) newFloat64 += 2.0 fmt.Println("加2.0后,结果是", newFloat64) newFloat64 -= 6.0 fmt.Println("接着减6.0后,结果是", newFloat64) newFloat64 *= 4.0 fmt.Println("而后乘4.0,结果是", newFloat64) newFloat64 /= 3.0 fmt.Println("最后除3.0,结果是", newFloat64) fmt.Println() fmt.Println() default: fmt.Println("unknown type") } } func check_convert(ok bool) { if false == ok { panic("type cast failed!") } }
程序运行结果为:函数
从上面结果能够知道,浮点数类型默认为float64。还有一点要注意的是,newInt, ok := general.(int),其中ok是bool值;而在golang中,相似这种返回多个值的其余语句,ok的值常常会与nil相比较。spa
interface{}是一个通用类型,能够储存任意类型的值。在代码前面,声明了一个名为general的interface{}值,而后依次存储一个浮点数和一个整数,经过switch general.(type)判断general存储的值的类型,而后按照类型使用相似general.(int)的方法对general进行类型转换(其实是接口查询或者接口转换,做用是判断general是否实现了int的方法;之因此叫类型转换,是由于interface{}里面没有定义任何方法,并且它的做用也的确跟类型转换同样)。在这里用数字作例子,是由于数字简单,容易理解。咱们知道,数字能够进行四则运算,在这里,我对general转换获得的数字进行加法运算,加2,而后打印加法的结果。从运行结果来看,通过转换后的数字能够进行正确的数字运算。各位能够本身算算。code
从上面程序能够看出使用interface的过程,把其余类型的值赋值给interface,而后进行接口查询,ok就进行符合这个类型的操做。也就是说只要这个类型的操做函数跟interface里面定义的函数声明相同,就可使用这个interface。duck type定义就是:If it walks like a duck and quacks like a duck, it's a duck。中文意思大概是,若是它走得像一个鸭子,并且也像鸭子嘎嘎叫,那么它就是鸭子。你们能够参考其余使用interface的例子来参考,在这里就很少作解释,水平有限。blog
转贴请注明来自:格通接口