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

问题描述 投票:0回答:1

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

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 时遇到这个问题,其他人也可能会遇到这个问题吗?

go
1个回答
6
投票

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

   switch v := value.(type) {
    case string:
        // v is string here
        parseString(v)
    ...
© www.soinside.com 2019 - 2024. All rights reserved.