Golang中用interface{}接收任何参数与强转
Golang 参数 接收 任何 interface 中用
2023-09-14 09:12:25 时间
函数的传值中,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.
ButiAreaId := int(val)
is not any of the cases 1.-7.
野生翻译如下:
我懒得翻了。。。。
相关文章
- golang map转json
- Golang|一键socks5代理以及端口复用小工具
- Golang(七)golang.org/x/time/rate 实现频率限制
- 解决golang json: unsupported value: NaN
- 用golang开发系统软件的一些细节
- Golang ast 的使用
- RSS Can:使用 Golang Rod 解析浏览器中动态渲染的内容:(四)
- 一次golang程序无故频繁重启的问题
- Golang 限流器(1) - Golang 标准库限流器
- Golang标准库 container/heap
- Golang标准库time(1) - 程序员需要相信的关于时间的谎言 时间可以倒流
- Golang 单元测试 - 逻辑层
- Golang Block 到底是什么? i:=i 合法且常用? 为什么能解决闭包变量冲突?
- 数据结构【Golang实现】(二)——循环链表
- Golang流媒体实战之七:hls拉流服务源码阅读
- 在Linux系统中探索Golang的精彩之旅(linuxgolang)
- 使用 Golang 操控 Redis 实现分布式锁(redis锁golang)