【问题标题】:How to make variable assignment with "or"如何用“或”进行变量赋值
【发布时间】:2020-02-16 23:46:01
【问题描述】:

是否有可能,以及如何使用这种逻辑进行单行(或只是简短)var 赋值:

a := b (or if b is false, nil or undifined, then a equals to) "hello"  

我试着做:

a := b | "hello"

但出现错误:“运算符 | 未在字符串上定义”。

所以我来自 JS,并尝试实现:

const a = b || "hello";

但在“Go-way”中

因为它是静态类型的 Lang,我的意思是如果 b == ""(空字符串)

【问题讨论】:

  • 这是go,不是JS。 Go 是静态类型的。所以在那个时候,b 不能是未定义的,它可以是 nil(这意味着它是一个指针或引用类型之一),或者是 false,这意味着它是一个 bool。所以你试图做的事情是不可能的。
  • 在 go 中没有多大意义。主要是因为值是类型不变的。意思是,如果b 是一个字符串,那么它不能是 nil、false、undefined 或 nan 或其他定义的类型,它必须是一个字符串。至于智能声明和语法糖,Go 不会让你很满意。不要与之抗争。
  • Cerise Limón,好吧,在这种特殊情况下,是的,但总的来说,我一直在寻找所需的语法(但正如许多人所说,这在语言中是不可能的)

标签: go


【解决方案1】:

没有像这样的 Go 语法。使用 if 语句。

| 的操作数必须是整数。 || 的操作数必须是布尔值。

此外,string 不能是 false 或 nil。

鉴于OP's actual goal 是为环境变量提供默认值,测试应该在os.LookupEnv 的布尔返回值上进行,而不是字符串值。使用这样的函数:

func getenv(key string, def string) string {
     val, ok := os.LookupEnv(key)
     if !ok {
         val = def
     }
     return val
}

【讨论】:

    【解决方案2】:

    在为 Env 变量定义默认值时,我也有类似的愿望。

    我解决它的方法是定义一个函数来做,像这样:

    func getenv(key, fallback string) string {
        value := os.Getenv(key)
        if len(value) == 0 {
            return fallback
        }
        return value
    }
    

    当我调用这个函数时,它看起来就像“或”一样简洁:

    port := getenv("PORT", "8000")
    

    您可以为自己的用例定义自己的函数。

    【讨论】:

    • 哦,是的,谢谢,我需要它来定义 Env vars 的默认值
    【解决方案3】:

    我认为做你自己的功能很棒,但 golang 有自己的方式来管理标志,这里是一个例子

    import (
        "flag"
    )
    
    func main() {    
        env := flag.String("env", "dev", "description")
    }
    

    所以这里 env 的默认值是 dev 并且你运行并更改它

    go run main.go -env=prod
    

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2014-04-30
      相关资源
      最近更新 更多