我可以将变量类型与 Golang 中的 .(type) 进行比较吗?

Posted

技术标签:

【中文标题】我可以将变量类型与 Golang 中的 .(type) 进行比较吗?【英文标题】:Can I compare variable types with .(type) in Golang? 【发布时间】:2016-04-21 14:26:40 【问题描述】:

我对接口变量的 .(type) 语法感到很困惑。是否可以这样使用:

var a,b interface
// some code
if first.(type) == second.(type) 

或者 reflect.TypeOf() 是检查 a 和 b 的底层类型是否相同的唯一选项?我在上面的代码中做了什么比较?

【问题讨论】:

我在上面的代码中做了什么比较?没有,因为它不能编译。 【参考方案1】:

someInterface.(type)仅在类型开关中使用。事实上,如果您尝试运行它,您会在错误消息中看到它。

func main() 
    var a, b interface
    a = 1
    b = 1

    fmt.Println(a.(type) == b.(type))

prog.go:10:使用 .(type) 外部类型开关

你可以做的是a.(int) == b.(int),这和int(a) == int(b)真的没有什么不同

func main() 
    var a, b interface
    a = 1
    b = 1

    fmt.Println(a.(int) == b.(int))

是的

【讨论】:

请注意,如果两个变量都不是int 类型,第二个示例将出现恐慌。 问题是比较类型,而不是比较相同类型的值。 第二个代码和问题有什么关系? 所以问题是“是否可以像这样使用.(type)?...”上面给出的答案是否定的。但如果你想这样做,你可以这样做。诚然 .(int) 事情有点奇怪,而恐慌的事情是一个问题。但这是唯一能回答问题的答案。【参考方案2】:

您需要指定类型。该语法用于使type assertions 与接口有关,而不是用于检查特定类型。 为此,您必须使用 reflect.TypeOf

您可以查看此answer 以正确使用类型断言。

【讨论】:

【参考方案3】:
func isType(a, b interface) bool 
    return fmt.Sprintf("%T", a) == fmt.Sprintf("%T", b)

"%T" fmt 选项在后台使用反射,这将使上述语句实际上与以下语句相同:

func isType(a, b interface) bool 
    return reflect.TypeOf(a) == reflect.TypeOf(b)

任何一个都可以,并且不会像其他一些建议那样尝试使用任何类型的断言来引起恐慌。

【讨论】:

【参考方案4】:

请试试这个:

for key, value := range data 
    switch v := value.(type) 
    case string:
        fmt.Println(key, value, "(string)")
    case float64:
        fmt.Println(key, value, "(float64)")
    case []interface:
        fmt.Println(key, value, "(interface)")
    
 

... 并且您可以在任何界面中使用所有类型...

【讨论】:

类似语法:***.com/a/26976477/12817546

以上是关于我可以将变量类型与 Golang 中的 .(type) 进行比较吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Golang 中使用接口与地图?

Golang:将接口动态转换为类型化变量

golang-指针类型

Golang入门到项目实战 | golang函数类型与函数变量

变量的基本类型与零值-GOLANG

Golang入门:安装与配置环境变量的意义