好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

golang从类型转换角度看interface

golang从类型转换角度看interface

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

刚开始接触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!  "  )
    }
} 

程序运行结果为:

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

转贴请注明来自: 格通

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于golang从类型转换角度看interface的详细内容...

  阅读:32次