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

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

  • 相关阅读:
    Java web 会话技术 cookie与session
    Spring bean的bean的三种实例化方式
    Spring基础篇——通过Java注解和XML配置装配bean(转载)
    Spring的核心api和两种实例化方式
    Spring 7种事务传播类型
    leetcode 697
    leetcode 387
    Spring_002 依赖注入方式实现
    Spring_第一个Spring入门案例IOC
    谈谈对Spring IOC的理解(转载)
  • 原文地址:https://www.cnblogs.com/ExMan/p/11459428.html
Copyright © 2011-2022 走看看