当我声明变量时,我想在Go中模拟OR |
运算符。因此,当未显示该值时,请返回右侧:
port := strconv.Itoa(os.Getenv("PORT")) | "8080"
我怎样才能做到这一点?
答案 0 :(得分:1)
你不能在Go中使用|
或||
。
|
是Arithmetic operator,仅适用于数值,||
是Logical operator,仅适用于布尔值。
Go没有" truthy"或" falsy"就像在JavaScript中一样;例如if "some_string"
或if 0
无效。您需要明确使用与==
,>
:if 0 == 0
和if "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的本质是非常明确且易于阅读。
但是你得到了类型安全性和可读性: - )