从Go中的Javascript中变量声明中模拟OR运算符

时间:2017-05-22 16:47:26

标签: go

当我声明变量时,我想在Go中模拟OR |运算符。因此,当未显示该值时,请返回右侧:

port := strconv.Itoa(os.Getenv("PORT")) | "8080"

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

你不能在Go中使用|||

|Arithmetic operator,仅适用于数值,||Logical operator,仅适用于布尔值。

Go没有" truthy"或" falsy"就像在JavaScript中一样;例如if "some_string"if 0无效。您需要明确使用与==>if 0 == 0if "some_string" == ""的比较。

Itoa总是返回一个String,os.GetEnv也是如此,它被记录为返回一个字符串并且:

  

返回值,如果变量不存在,该值将为空。

"空"是一个"空字符串"。在Go中,字符串始终是一个字符串;只有一组有限的值(如指针和error)可以与nil进行比较(而字符串就像字符串一样)。

它永远不会返回数字类型(例如int),因此将此输出传递给Itoa始终是错误。

你可能想要的是Atoi,它返回一个错误作为第二个返回值:

port, err := strconv.Atoi(os.Getenv("PORT"))
if err != nil {
    fmt.Println("unable to get PORT environment variable, falling back to 8080")

    // Use =, not :=
    // Otherwise it'll create new port variable local to this if block.
    // Common mistake for beginners and even experienced programmers.
    port = 8080
}

或者:

port := 8080
if os.Getenv("PORT") != "" {
    var err error
    port, err = strconv.Atoi(os.Getenv("PORT"))
    if err != nil {
        fmt.Fprintf(os.Stderr, "error: unable to get PORT environment variable: %v\n", err)
        os.Exit(1)
    }
}

如果您正在思考" gee,那与我的JavaScript单线程相比,那就是冗长的!"那你就是对的。在某种程度上,这是由于静态与动态语言的本质,部分原因在于Go的本质是非常明确且易于阅读。

但是你得到了类型安全性和可读性: - )