zoukankan      html  css  js  c++  java
  • Golang中用interface{}接收任何参数与强转

    函数的传值中,interface{}是可以传任意参数的,就像java的object那样。
    下面上我第一次想当然写的 ** 错误 **代码

    package main
    
    func main() {
    
        Any(2)
        Any("666")
    }
    
    func Any(v interface{})  {
         v1:=int(v)
         println(v1)
        
    }
    

    我只是想它能通过编译而已,因为上面的错误代码并没有任何的语法错误,心里只有666想说,下面是编译的错误提示:
    cannot convert v (type interface {}) to type int: need type assertion
    正确的代码就可以保证程序不出什么差错。

    package main
    func main() {
        Any(2)
        Any("666")
    }
    func Any(v interface{})  {
    
        if v2, ok := v.(string);ok{
            println(v2)
        }else if v3,ok2:=v.(int);ok2{
            println(v3)
        }
    }
    

    输出如下

    2
    666
    

    不得不惊叹go的严谨啊。java写类似代码一下就编过去了。

    无形之中我喷了java 好多好多,但它毕竟是20年前的语言,比我年纪还大,有些问题是真的没办法,现在基于jvm的kotlin,如果我当时没有放弃android的话,我想我现在的主要工作语言就是它了。

    解释一下,为什么Golang有些情况下,强转可以,有点情况下,强转不可以:
    其实stack overflow一个国外大神说的很好了,
    原话+野生翻译

    The reason why you cannot convert an interface typed value are these rules in the referenced specs parts:
    Conversions are expressions of the form T(x) where T is a type and x is an expression that can be converted to type T.
    A non-constant value x can be converted to type T in any of these cases:

    • x is assignable to T.
    • x's type and T have identical underlying types.
    • x's type and T are unnamed pointer types and their pointer base types have identical underlying types.
    • x's type and T are both integer or floating point types.
    • x's type and T are both complex types.
    • x is an integer or a slice of bytes or runes and T is a string type.
    • x is a string and T is a slice of bytes or runes.
      But
      iAreaId := int(val)is not any of the cases 1.-7.

    地址:关于interface{}做为参数

    野生翻译如下:
    我懒得翻了。。。。

  • 相关阅读:
    利用Python 统计txt 文档词频 次数
    Markdown工具Typora结合gitee码云图床自动上传云端图片
    主数据MDM下发eHR系统操作整理v1.0
    Python读取Excel数据生成图表 v2.0
    HTML基础(20200610)
    Python网络编程socket 简易聊天窗
    selenium-python-验证码-动态验证码
    selenium-python-验证码-滑动验证码
    Linux系统学习 20200506
    @Mapper @Insert 注解式方法批量入库(ORACLE数据库)
  • 原文地址:https://www.cnblogs.com/ExMan/p/11459428.html
Copyright © 2011-2022 走看看