golang--从类型转换角度看interface

概述刚开始接触golang,可能对interface的使用有些迷惑,尤其在有些资料里,介绍得更是云里雾里,让人搞不清楚。本文尝试从类型转换的角度来解析interface,希望对大家能有所帮助。不多说,先上代码。 package main import ( "fmt" ) func main() { var general interface{} general = 6.6 type_cast(gene

刚开始接触golang,可能对interface的使用有些迷惑,尤其在有些资料里,介绍得更是云里雾里,让人搞不清楚。本文尝试从类型转换的角度来解析interface,希望对大家能有所帮助。不多说,先上代码。

package main import ( "fmt" ) func main() { var general interface{} general = @[email protected] type_cast(general) general = @H_403_20@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 += @H_403_20@2 fmt.Println("加2后,结果是",newInt) newInt -= @H_403_20@6 fmt.Println("接着减6后,结果是",newInt) newInt *= @H_403_20@4 fmt.Println("然后乘4,结果是",newInt) newInt /= @H_403_20@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 += @[email protected] fmt.Println("加2.0后,结果是",newfloat32) newfloat32 -= @[email protected] fmt.Println("接着减6.0后,结果是",newfloat32) newfloat32 *= @[email protected] fmt.Println("然后乘4.0,结果是",newfloat32) newfloat32 /= @[email protected] 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 += @[email protected] fmt.Println("加2.0后,结果是",newfloat64) newfloat64 -= @[email protected] fmt.Println("接着减6.0后,结果是",newfloat64) newfloat64 *= @[email protected] fmt.Println("然后乘4.0,结果是",newfloat64) newfloat64 /= @[email protected] 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相比较。

interface{}是一个通用类型,可以储存任意类型的值。在代码前面,声明了一个名为general的interface{}值,然后依次存储一个浮点数和一个整数,通过switch general.(type)判断general存储的值的类型,然后按照类型使用类似general.(int)的方法对general进行类型转换(实际上是接口查询或者接口转换,作用是判断general是否实现了int的方法;之所以叫类型转换,是因为interface{}里面没有定义任何方法,而且它的作用也的确跟类型转换一样)。在这里用数字做例子,是因为数字简单,容易理解。我们知道,数字可以进行四则运算,在这里,我对general转换得到的数字进行加法运算,加2,然后打印加法的结果。从运行结果来看,经过转换后的数字可以进行正确的数字运算。各位可以自己算算。


从上面程序可以看出使用interface的过程,把其他类型的值赋值给interface,然后进行接口查询,ok就进行符合这个类型的 *** 作。也就是说只要这个类型的 *** 作函数跟interface里面定义的函数声明相同,就可以使用这个interface。duck type定义就是:If it walks like a duck and quacks like a duck,it's a duck。中文意思大概是,如果它走得像一个鸭子,而且也像鸭子嘎嘎叫,那么它就是鸭子。大家可以参考其他使用interface的例子来参考,在这里就不多做解释,水平有限。

转贴请注明来自:格通

总结

以上是内存溢出为你收集整理的golang--从类型转换角度看interface全部内容,希望文章能够帮你解决golang--从类型转换角度看interface所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1285531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存