首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复条件语句

复条件语句
EN

Stack Overflow用户
提问于 2014-06-08 20:08:23
回答 2查看 4.5K关注 0票数 4

我最近开始学习歌朗和雷维尔。我想弄清楚下面的if语句到底是做什么的。似乎是在做类型检查,但我看不出条件实现了什么。如果有人能告诉我这里发生了什么,我很感激。谢谢

代码语言:javascript
复制
if str, ok := obj.(string); ok {
return len(str) > 0
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-08 20:11:28

它试图将obj (可能是某种抽象接口)转换为字符串,检查它是否有效,并且只有在结果正常的情况下才进入。

写得更少,可以看作是:

代码语言:javascript
复制
// 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不是字符串,这段代码将使您的程序崩溃:

代码语言:javascript
复制
str := obj.(string) 
return len(str) > 0   

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

断言

票数 6
EN

Stack Overflow用户

发布于 2014-06-08 20:15:02

这叫做类型断言。您的变量obj是一个interface{},换句话说,它的真正类型可以从一个执行更改到另一个。类型断言用于确定interface{}的真实类型。这样做有两种方法:

代码语言:javascript
复制
str = obj.(string)

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

例如:

代码语言:javascript
复制
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..."
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24110330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档