我最近开始学习歌朗和雷维尔。我想弄清楚下面的if语句到底是做什么的。似乎是在做类型检查,但我看不出条件实现了什么。如果有人能告诉我这里发生了什么,我很感激。谢谢
if str, ok := obj.(string); ok {
return len(str) > 0
}发布于 2014-06-08 20:11:28
它试图将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 您可以阅读更多关于文档中类型断言的信息:
断言
发布于 2014-06-08 20:15:02
这叫做类型断言。您的变量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..."https://stackoverflow.com/questions/24110330
复制相似问题