2012-10-30 62 views
75

我曾嘗試:聲明一個常量數組

const ascii = "abcdefghijklmnopqrstuvwxyz" 
const letter_goodness []float32 = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 } 
const letter_goodness = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 } 
const letter_goodness = []float32 { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 } 

首先,聲明和初始化工作正常,但第二,第三和第四不起作用。我怎樣才能聲明和初始化浮點數的const數組?

回答

109

一個數組本身並不是不可改變的;你不能讓它保持不變。

你可以得到最近的是:

var letter_goodness = [...]float32 {.0817, .0149, .0278, .0425, .1270, .0223, .0202, .0609, .0697, .0015, .0077, .0402, .0241, .0675, .0751, .0193, .0009, .0599, .0633, .0906, .0276, .0098, .0236, .0015, .0197, .0007 } 
+71

只是爲了澄清:該'[...] T'語法糖'[123] T'。它創建一個固定大小的數組,但讓編譯器找出它中有多少個元素。 – jimt

+3

我想允許常量數組需要更新類型系統。否則,如果你定義了一個函數'f(xs [5] int)',你不知道傳遞的數組是否是常量或可變的。 –

+0

tks,我嘗試字符串時遇到問題。加入'不能使用constants.FilesRequired(類型[4]字符串)作爲類型[]字符串參數strings.Join' –

34

Effective Go

常量在Go是正義的常數。它們是在編譯時創建的,即使在函數中定義爲locals時,也只能是數字,字符串或布爾值。由於編譯時限制,定義它們的表達式必須是常量表達式,可由編譯器進行評估。例如,1 < < 3是一個常量表達式,而math.Sin(math.Pi/4)並不是因爲函數調用math.Sin需要在運行時發生。

片和陣列運行期間總是評價:

var TestSlice = []float32 {.03, .02} 
var TestArray = [2]float32 {.03, .02} 
var TestArray2 = [...]float32 {.03, .02} 

[...]告訴編譯器找出陣列本身的長度。切片包裝數組,在大多數情況下更容易處理。而不是使用常量才使變量不可訪問到其他包使用小寫首字母:

var ThisIsPublic = [2]float32 {.03, .02} 
var thisIsPrivate = [2]float32 {.03, .02} 

thisIsPrivate只可在定義它的包。如果您需要從外部讀取訪問權限,則可以編寫一個簡單的getter函數(請參閱Getters in golang)。

+0

「使用」示例代碼無效Go:http://play.golang.org/p/JUsLIsIwkW – zzzz

+0

對不起,您是對的。我的第一個答案是完全錯誤的。此編輯答案現在應該提供更多幫助。 – fasmat

9

Go中沒有數組常量這樣的事情。

Go Language Specification: Constants引用:

布爾常量符常數整數常數浮點常數復常數,和字符串常量。符文,整數,浮點和復常數統稱爲數字常量

Constant expression(其被用來初始化一個常數)可以僅含有constant操作數和在編譯時被評估。

該規範列出了不同類型的常量。請注意,您可以使用constant expressions創建並初始化具有允許類型之一的常量作爲underlying type。例如,這是有效的:

func main() { 
    type Myint int 
    const i1 Myint = 1 
    const i2 = Myint(2) 
    fmt.Printf("%T %v\n", i1, i1) 
    fmt.Printf("%T %v\n", i2, i2) 
} 

輸出(嘗試在Go Playground):

main.Myint 1 
main.Myint 2 

如果你需要一個數組,它只能是一個變量,而不是一個常量。

我推薦一下常量這個偉大的博客文章:Constants

+0

那麼如果需要一個大小不變的容器呢? –

+0

@Atomic_alarm您能否詳細說明一下? – icza

+0

是否存在於golang模擬C陣列中? –

1

正如其他人所提到的,沒有正式的圍棋構建此。我能想象的最接近的是一個返回切片的函數。通過這種方式,您可以保證沒有人會操縱原始切片的元素(因爲它是「硬編碼」到數組中的)。

我已經縮短你的片,使其... ...短:

func GetLetterGoodness() []float32 { 
    return [...]float32 { .0817,.0149,.0278,.0425,.1270,.0223 } 
} 
+0

這聽起來像是最好的方法,但func返回類型不匹配。 '不能在返回參數中使用[6]字符串字符串(類型[6]字符串)作爲類型[]字符串' 所以'return [] float32 {...} – theRemix