2011-08-04 44 views

回答

5

const

const (
    pi = 3.14 
    foo = 42 
    bar = "hello" 
) 
+0

可能這樣的塊有一個名字嗎? –

+1

@Darius:no :-(反正這不是分組 –

+0

如果你給所有的常量賦予相同的用戶自定義類型,你可以在某個意義上給出一個塊的名稱,有點像lnmx試圖在MyFlag中做的事情例如, –

11

有兩種選擇,這取決於如何使用常量。

首先是要建立基於誠信一個新的類型,以及使用這種新型聲明你的常量,例如:

type MyFlag int 

const (
    Foo MyFlag = 1 
    Bar 
) 

FooBar將有類型MyFlag。如果你想從MyFlag提取int值回來了,你需要一個類型coersion:

var i int = int(Bar) 

如果這是不方便的,裸常量塊的使用newacct的建議:

const (
    Foo = 1 
    Bar = 2 
) 

FooBar是可以分配給int,float等的完美常量。

這在「常量」部分的Effective Go中涵蓋。另請參閱iota關鍵字對C/C++等值的自動分配的討論。

+1

這是不正確的,在你的第一個例子中,Bar是無類型的,如果賦值的右邊是空白的,它只會選擇Foo的類型,在這種情況下你可以使用iota。 –

+0

@Evan更正了,謝謝,我在發佈答案之前測試了我的示例,但不知怎的,額外的任務彈出了那裏。 – lnmx

+0

我不確定你是否打算這麼做,但現在它們具有相同的值和類型。 –

2

這取決於你想通過這個分組實現什麼。

const (
    c0 = 123 
    c1 = 67.23 
    c2 = "string" 
) 

這只是增加了不錯的視覺塊程序員(編輯允許摺疊),但什麼都不做的編譯器(你不能指定塊的名稱):去允許與以下括號語法分組。

唯一依賴於此塊的是Go中的iota constant declaration(這對enums來說非常方便)。它允許您輕鬆創建自動增量(不僅僅是自動增量:鏈接上的更多內容)。

例如這樣的:

const (
    c0 = 3 + 5 * iota 
    c1 
    c2 
) 

將創建常量c0 = 3(3 + 5 * 0),c1 = 8(3 + 5 * 1)和c2 = 13(3 + 5×2)。

1

我最接近枚舉的方法是將常量聲明爲類型。至少你有一些類型安全性,這是枚舉類型的主要特性。

type PoiType string 

const (
    Camping   PoiType = "Camping" 
    Eatery    PoiType = "Eatery" 
    Viewpoint   PoiType = "Viewpoint" 
)