Golang 类型切换需要(冗余)类型断言

Jac*_*ack 2 go

我想使用类型开关来调用特定于类型的解析函数

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)
}
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译,因为它缺少类型断言

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)
}
Run Code Online (Sandbox Code Playgroud)

但这感觉是多余的。我现在检查两次,该值是否是字符串。

我应该在类型开关和类型断言之间进行选择吗?也许有一种不太冗余的方法来做到这一点?这个例子是人为的。可能有很多类型,这就是为什么类型开关看起来像是干净的解决方案......直到我开始添加类型断言。

更新

这个问题已收到多次否决票。我认为这忽略了 Go 类型开关的令人困惑的本质,它看起来(最初)好像被打开的值是 type 而不是value

switch v := value.(type) {
    case string:
    // ...
    case int:
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我是 Go 新手,错误地认为v是这种类型。如果我第一次写 Go 时遇到这个问题,其他人也可能会遇到这个问题吗?

Bur*_*dar 6

使用您在开关中声明的值:

   switch v := value.(type) {
    case string:
        // v is string here
        parseString(v)
    ...
Run Code Online (Sandbox Code Playgroud)