【问题标题】:Const declaration with multiple return values具有多个返回值的 const 声明
【发布时间】:2014-02-19 18:05:42
【问题描述】:

我想定义一个常量值:

 const var *url.URL = url.Parse("http://yahoo.com/")

我知道我必须完全定义变量及其类型。即我不能只使用“:=”简写。

但是评估函数的返回值同时返回常量和错误。

  var, _ := url.Parse("http://yahoo.com/")

现在我如何声明 var 是常量并在这种情况下丢弃错误?

【问题讨论】:

    标签: go


    【解决方案1】:

    首先,不需要指定类型,直接写var foo = <expression>即可。 您需要使用var 而不是:= 的唯一原因是that short variable declarations are only allowed in functions,但您在函数之外进行操作。

    其次,你不能对常量值使用函数调用,因为它们不是常量(必须评估函数,这违反了 Go 对常量的定义)。另见the spec on what constants are

    常量值由符文、整数、浮点数、虚数或字符串文字、表示常量的标识符、常量表达式、结果为常量的转换或某些结果值表示内置函数,例如 unsafe.Sizeof 应用于任何值,cap 或 len 应用于某些表达式,real 和 imag 应用于复数常量,复数应用于数值常量。布尔真值由预先声明的常量 true 和 false 表示。预先声明的标识符 iota 表示一个整数常量。

    这里没有用户定义的函数。

    你可以做的是定义一个varon play):

    func MustParse(s string) url.URL {
        url, err := url.Parse(s)
        if err != nil { 
            panic(err); 
        }
        return *url
    }
    
    var foo = MustParse("http://yahoo.com/")
    

    当然你也可以

    var foo, _ = url.Parse("foo")
    

    但是这样你就不会看到你的 URL 是否错误。

    【讨论】:

    • 感谢 @nemo 帮助我理解 Go 的常量值。我对常数的内在想法是错误的。
    【解决方案2】:

    你不能两者都做。对不起。首先:Go 中没有 const 变量。第二:您不能将变量命名为var,因为var 是关键字。第三:在函数体之外不允许短变量声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多