2014-02-19 186 views
1

我想定义一个恒定值:常量声明与多个返回值

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

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

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

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

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

回答

8

首先,你不需要指定类型,你可以简单地写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是错误的。

+0

感谢@nemo帮助我理解go的不变价值。我对常数的内部想法是错误的。 – enjoylife

3

你不能这样做。抱歉。首先:Go中没有const变量。第二:由于var是关键字,因此无法命名变量var。第三:在函数体外不允许使用短变量声明。