我想使用类型开关来调用特定于类型的解析函数
https://play.golang.org/p/2xj_owLL4ZK
package main
import (
"fmt"
)
func main() {
var value interface{}
value = "I am a string"
switch v := value.(type) {
case string:
parseString(value)
default:
fmt.Printf("I don't know about type %T!\n", v)
}
}
func parseString(s string) {
fmt.Println(s)
}
但是这不会编译,因为它缺少 类型断言:
cannot use value (type interface {}) as type string in argument to parseString: need type assertion
添加类型断言修复了错误。
https://play.golang.org/p/p0nYNEEJb0Z
package main
import (
"fmt"
)
func main() {
var value interface{}
value = "I am a string"
switch v := value.(type) {
case string:
s, ok := value.(string)
if ok {
parseString(s)
}
default:
fmt.Printf("I don't know about type %T!\n", v)
}
}
func parseString(s string) {
fmt.Println(s)
}
但这感觉是多余的。我现在检查两次,该值是否是一个字符串。
我应该在类型开关和类型断言之间进行选择吗?也许有一种不太冗余的方法来做到这一点?这个例子是人为的。可能有很多类型,这就是为什么类型开关看起来像是干净的解决方案......直到我开始添加类型断言。
这个问题已收到多次否决。我认为这忽略了 Go 类型开关的令人困惑的本质,它看起来(最初)好像被打开的值是 type,而不是 value。
switch v := value.(type) {
case string:
// ...
case int:
// ...
}
我是 Go 新手,错误地认为
v
是类型。如果我第一次写 Go 时遇到这个问题,其他人也可能会遇到这个问题吗?
使用您在开关中声明的值:
switch v := value.(type) {
case string:
// v is string here
parseString(v)
...