golang中的复杂条件语句

时间:2014-06-08 20:08:24

标签: if-statement go revel

我最近开始学习golang和Revel。我试图了解下面的if语句究竟是什么。似乎它正在进行类型检查,但我不知道条件实现了什么。感谢是否有人能告诉我这里发生了什么。感谢

if str, ok := obj.(string); ok {
return len(str) > 0
}

2 个答案:

答案 0 :(得分:5)

它试图将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
}

从某些界面到真实类型的安全转换是什么?如果你在没有ok部分的情况下这样做,如果obj不是一个字符串,你的程序将会惊慌失措。如果obj不是字符串,则此代码将使程序崩溃:

str := obj.(string) 
return len(str) > 0   

您可以在文档中阅读有关类型断言的更多信息:

http://golang.org/ref/spec#Type_assertions

答案 1 :(得分:3)

这称为type assertion。您的变量objinterface{},换句话说,它的实际类型可以从一个执行更改为另一个执行。类型断言用于确定interface{}的实际类型。有两种方法可以做到:

str = obj.(string)

这个是不安全的:如果obj不是string,程序就会惊慌失措。另一个是您在代码中使用的那个。如果obj不是string,则ok布尔值将为false

例如:

func f(v []interface{}) {
    if str, ok := v.(string); ok {
        fmt.Println("v is a string!")
    } else if f, 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..."