zoukankan      html  css  js  c++  java
  • 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的例子来参考,在这里就不多做解释,水平有限。

    转贴请注明来自:格通

  • 相关阅读:
    系统运行性能监控日志
    iptables 操作
    访问dubbo没有权限,通过ip进行跳转服务器,并通过有权限服务器代理访问
    乐观锁
    ES的优化布局
    Docker壳的配置笔记
    expect 实现iterm2自动加载pem登录跳板机
    mybaits-spring demo 记
    Java中volatile修饰符,不稳定标记的用法笔记
    用intellj 建一个spring mvc 项目DEMO
  • 原文地址:https://www.cnblogs.com/getong/p/2990749.html
Copyright © 2011-2022 走看看