• 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{}做为参数

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

  • 相关阅读:
    net中System.Security.Cryptography 命名空间 下的加密算法
    关于如何生成代码的帮助文档的链接
    Application.EnableVisualStyles();
    VS2010里属性窗口中的生成操作
    把普通的git库变成bare库
    MultiTouch camera controls source code
    android onTouch()与onTouchEvent()的区别
    iOS开发中常见的语句@synthesize obj = _obj 的意义详解
    java nio 快速read大文件
    使用ndk standalone工具链来编译某个平台下的库
  • 原文地址:https://www.cnblogs.com/ExMan/p/11459428.html
Copyright © 2020-2023  润新知