登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-21 09:57:32 294浏览 收藏

在 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)
}

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

不能使用值(类型接口 {})作为 parsestring 参数中的类型字符串:需要类型断言

添加类型断言修复了错误。

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 类型开关的令人困惑的本质,它看起来(最初)好像被打开的值是类型,而不是

switch v := value.(type) {
    case string:
    // ...
    case int:
    // ...
}

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


解决方案


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

switch v := value.(type) {
    case string:
        // v is string here
        parseString(v)
    ...

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>