【发布时间】:2014-06-08 20:08:23
【问题描述】:
我最近开始学习 golang 和 Revel。我试图理解下面的 if 语句到底是做什么的。似乎它正在进行类型检查,但我看不到条件实现了什么。感谢是否有人能告诉我这里发生了什么。谢谢
if str, ok := obj.(string); ok {
return len(str) > 0
}
【问题讨论】:
标签: if-statement go revel
我最近开始学习 golang 和 Revel。我试图理解下面的 if 语句到底是做什么的。似乎它正在进行类型检查,但我看不到条件实现了什么。感谢是否有人能告诉我这里发生了什么。谢谢
if str, ok := obj.(string); ok {
return len(str) > 0
}
【问题讨论】:
标签: if-statement go revel
它尝试将 obj (可能是一些抽象接口)转换为字符串,检查是否有效,只有在结果正常时才输入。
写得比较稀疏可以看成:
// do a type assertion/conversion of obj to a string.
// If obj isn't really a string, ok will be false
str, ok := obj.(string)
// this will only run if we're talking about a string
if ok {
return len(str) > 0
}
go 所做的是将某个接口安全地转换为真实类型。如果您在没有ok 部分的情况下执行此操作,如果 obj 不是字符串,您的程序将出现恐慌。即如果 obj 不是字符串,此代码将使您的程序崩溃:
str := obj.(string)
return len(str) > 0
您可以在文档中阅读有关类型断言的更多信息:
【讨论】:
这称为type assertion。您的变量obj 是interface{},换句话说,它的真实类型可以从一个执行更改为另一个执行。类型断言用于确定interface{} 的真实类型。有两种方法可以做到这一点:
str = obj.(string)
这个是不安全的:如果obj 不是string,程序将会崩溃。另一个是您在代码中使用的那个。如果obj 不是string,则ok 布尔值将是false。
例如:
func f(v interface{}) {
if _, ok := v.(string); ok {
fmt.Println("v is a string!")
} else if _, ok := v.(float64); ok {
fmt.Println("v is a float64!")
} else {
fmt.Println("v is something else...")
}
}
f(17.42) // "v is a float64!"
f("foobar") // "v is a string!"
f([]string{"hello", "world"}) // "v is something else..."
【讨论】:
[]interface{} 应替换为 interface{}。应该使用str 和if,例如。 fmt.Println(str) 和 fmt.Println(if).