英文:
Complex conditional statement in golang
问题
最近我开始学习Go语言和Revel框架。我试图理解下面的if语句到底是做什么的。看起来它在进行类型检查,但我不明白条件语句的作用是什么。如果有人能告诉我这里发生了什么,我将不胜感激。谢谢。
if str, ok := obj.(string); ok {
return len(str) > 0
}
这段代码的作用是检查obj
是否为字符串类型。如果是字符串类型,将其赋值给str
变量,并且ok
的值为true
。然后,判断str
的长度是否大于0,如果是,则返回true
,否则返回false
。
英文:
I recently started learning golang and Revel. Im trying to understand what exactly the below if statement does. Seems like it is doing a type check, but i dont see what the conditional achieves. Appreciate if anyone can tell me whats happening here. thanks
if str, ok := obj.(string); ok {
return len(str) > 0
}
答案1
得分: 6
它试图将 obj(可能是某个抽象接口的对象)转换为字符串,检查是否成功,并且只有在成功的情况下才进入 if 语句块。
更简洁地写,可以看作是:
// 将 obj 进行类型断言/转换为字符串
// 如果 obj 不是一个真正的字符串,ok 将为 false
str, ok := obj.(string)
// 只有当我们在处理一个字符串时才会执行这部分代码
if ok {
return len(str) > 0
}
Go 语言所做的是将某个接口安全地转换为实际类型。如果没有使用 ok
部分,如果 obj 不是一个字符串,你的程序将会发生 panic。也就是说,如果 obj 不是一个字符串,以下代码将会导致程序崩溃:
str := obj.(string)
return len(str) > 0
你可以在文档中了解更多关于类型断言的内容:
http://golang.org/ref/spec#Type_assertions
英文:
It tries to convert obj (which is of some abstract interface probably) into a string, checks if that worked, and only enters if it turned out okay.
Written more sparsely it can be viewed as:
// 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
}
What go does is safe casting from some interface to the real type. If you do this without the ok
part, your program will panic if obj isn't a string. i.e this code will crash your program if obj isn't a string:
str := obj.(string)
return len(str) > 0
You can read more about type assertions in the docs:
答案2
得分: 3
这被称为类型断言。你的变量obj
是一个interface{}
,换句话说,它的真实类型可以在不同的执行中改变。类型断言用于确定interface{}
的真实类型。有两种方法可以做到这一点:
str = obj.(string)
这种方法是不安全的:如果obj
不是一个string
,程序将会发生恐慌。另一种方法是你在代码中使用的方法。如果obj
不是一个string
,ok
布尔值将为false
。
例如:
func f(v interface{}) {
if _, ok := v.(string); ok {
fmt.Println("v是一个字符串!")
} else if _, ok := v.(float64); ok {
fmt.Println("v是一个float64!")
} else {
fmt.Println("v是其他类型...")
}
}
f(17.42) // "v是一个float64!"
f("foobar") // "v是一个字符串!"
f([]string{"hello", "world"}) // "v是其他类型..."
英文:
This is called a type assertion. Your variable obj
is an interface{}
, in other words, its real type can change from one execution to another. A type assertion is used to determine the real type of an interface{}
. There are two ways to do so:
str = obj.(string)
This one is unsecure: if ever obj
is not a string
, the program will panic. The other one is the one you used in your code. If obj
is not a string
, the ok
boolean will be false
.
For instance:
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..."
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论