2014-02-19 129 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。第三:在函數體外不允許使用短變量聲明。