设为首页 收藏本站
查看: 1222|回复: 0

[经验分享] golang--从类型转换角度看interface

[复制链接]

尚未签到

发表于 2018-9-20 07:25:45 | 显示全部楼层 |阅读模式
  刚开始接触golang,可能对interface的使用有些迷惑,尤其在有些资料里,介绍得更是云里雾里,让人搞不清楚。本文尝试从类型转换的角度来解析interface,希望对大家能有所帮助。不多说,先上代码。
  

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!")  
}
  
}
  

  程序运行结果为:
DSC0000.png

  从上面结果可以知道,浮点数类型默认为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的例子来参考,在这里就不多做解释,水平有限。
  转贴请注明来自:格通



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-597618-1-1.html 上篇帖子: golang与node.js的http对比测试 下篇帖子: Golang学习 - errors 包
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表