我可以将变量类型与 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) 进行比较吗?的主要内容,如果未能解决你的问题,请参考以下文章