【问题标题】:Complex conditional statement in golanggolang中的复杂条件语句
【发布时间】:2014-06-08 20:08:23
【问题描述】:

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

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

【问题讨论】:

    标签: if-statement go revel


    【解决方案1】:

    它尝试将 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   
    

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

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

    【讨论】:

    • 啊!!有道理,感谢您的快速响应。
    【解决方案2】:

    这称为type assertion。您的变量objinterface{},换句话说,它的真实类型可以从一个执行更改为另一个执行。类型断言用于确定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{}。应该使用strif,例如。 fmt.Println(str)fmt.Println(if).
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多