1. 程式人生 > >Go語言規範-常量/變數

Go語言規範-常量/變數

Go語言規範-常量/變數

常量

布林常量, rune 常量、整數常量、浮點數常量、複數常量、以及字串常量。其中Rune、整數、浮點數以及複數常量統稱數值常量.

常量值的表示可以是rune、整數、浮點數、虛數或字串字面,一個標記常量的識別符號、一個常量表達式、一個結果是常量的型別轉換,或某些內建函式的結果值(如可用於任何值的unsafe.Sizeof、可用於某些表示式的cap或len、可用於複數常量的real以及imag、以及可用於數值常量的complex)。 布林的真實值由預定義常量 true 和false表示。預定義的識別符號iota標記了整型常量。

通常來說複數常量是一個常量表達式的形式

數值常量表示任意精度的確定值且不會溢位。因此沒有常量來標記IEEE-754 負零、無窮和非數值值。

常量可以是有型別或無型別的。字面常量、true、false、iota以及特定的只具有無數型常量運算元的常量表達式是無型別的。

一個常量可以通過常量宣告型別轉化被顯示地賦與型別,也可以在賦值或作為表示式的運算元時被隱式地賦與型別。如果常量值不能被表示成特定型別,是一個錯誤。

一個無型別的常量具有預設型別,根據上下文所需型別值隱式轉換,例如:在短變數宣告i:=0中沒有顯式的型別。無型別常量的預設型別可以是bool、 rune、 int、float64、complex128或string中之一,取決於它是否是一個boolean、rune、integer、floating-point、complex或string 常量。

實現的限制:儘管數值常量具有任意精度,但是編譯器的內部表示可能只具有有限精度。即每個實現必須:

  • 用至少256位來表示整型常量。
  • 用至少256位的尾數以及至少16位的有符號二進位制指數來表示浮點常量及複數常量。
  • 如果不能精確表示一個整型常量時應該給出一個錯誤。
  • 如果因為溢位而不能表示一個浮點或複數常量時應該給出一個錯誤
  • 當因為精度限制而不能表示一個浮點或複數常量時,應該舍入到最近似的可表達的常量。

以上要求對字面常量和通過求值常量表達式得到的結果都適用。

變數

變數是一個持有的儲存空間位置。其合法值集由變數的型別決定。

變數宣告(對於函式引數及返回值來說,是函式宣告或函式字面的簽名),為已命名的變數保留了儲存空間。呼叫內建函式new或取一個組合字面

的地址,會在執行時給變數分配儲存空間。這樣的匿名變數是通過 (可能是隱含的)指標間接引用的。

結構化變數array、slice、以及struct 型別具有可以獨立定址的元素和欄位。每個這樣的元素都可以當成是一個變數。

變數的靜態型別 (或 立即型別)是在宣告中給出的型別、或是呼叫new或組合字面時提供的型別、或是結構化變數中元素的型別。介面型別的變數還有單獨的動態型別,即執行時賦給變數的值的型別(除非這個值 是預定義識別符號nil,它沒有型別)。在執行時動態型別是可以變化的,但是儲存在介面變數中的值總是可以被賦給變數的靜態型別。

var x interface{} // x is nil and has static type interface{} var v
*T // v has value nil, static type *T x = 42 // x has value 42 and dynamic type int x = v // x has value
(*T)(nil) and dynamic type *T

變數的值 是通過引用表示式中的變數來取得的;它是最近一次賦給變數的值,如果一個變數沒有被賦值過,它的值就是其型別所規定的零值。