Go基礎(chǔ)——常量

定義

關(guān)鍵字 const 被用于表示常量统阿,常量用于存儲(chǔ)不會(huì)改變的數(shù)據(jù),常量中的數(shù)據(jù)類型只可以是布爾型筹我、數(shù)字型(整數(shù)型扶平、浮點(diǎn)型和復(fù)數(shù))和字符串型。

const identifier [type] = value

常量不能再重新賦值為其他的值

    const a = 55 // 允許
    a = 89       // 不允許重新賦值

常量的值會(huì)在編譯的時(shí)候確定蔬蕊。因?yàn)楹瘮?shù)調(diào)用發(fā)生在運(yùn)行時(shí)结澄,所以不能將函數(shù)的返回值賦值給常量。

package main

import (  
    "fmt"
    "math"
)

func main() {  
    fmt.Println("Hello, playground")
    var a = math.Sqrt(4)   // 允許
    const b = math.Sqrt(4) // 不允許
}

在上面的程序中岸夯,因?yàn)?a 是變量麻献,因此我們可以將函數(shù) math.Sqrt(4) 的返回值賦值給它(我們將在單獨(dú)的地方詳細(xì)討論函數(shù))。

b 是一個(gè)常量猜扮,它的值需要在編譯的時(shí)候就確定勉吻。函數(shù) math.Sqrt(4) 只會(huì)在運(yùn)行的時(shí)候計(jì)算,因此 const b = math.Sqrt(4) 將會(huì)拋出錯(cuò)誤 error main.go:11: const initializer math.Sqrt(4) is not a constant)

字符串常量

??雙引號(hào)中的任何值都是 Go 中的字符串常量旅赢。例如像 Hello WorldSam 等字符串在 Go 中都是常量齿桃。
什么類型的字符串屬于常量?答案是他們是無類型的煮盼。
Hello World 這樣的字符串常量沒有任何類型短纵。

const hello = "Hello World"

上面的例子,我們把 Hello World 分配給常量 hello〗┛兀現(xiàn)在常量 hello 有類型嗎香到?答案是沒有。常量仍然沒有類型报破。Go 是一門強(qiáng)類型語言悠就,所有的變量必須有明確的類型。那么, 下面的程序是如何將無類型的常量 Sam 賦值給變量 name 的呢充易?

package main

import (  
    "fmt"
)

func main() {  
    var name = "Sam"
    fmt.Printf("type %T value %v", name, name)

}

答案是無類型的常量有一個(gè)與它們相關(guān)聯(lián)的默認(rèn)類型理卑,并且當(dāng)且僅當(dāng)一行代碼需要時(shí)才提供它。在聲明中 var name = "Sam" 蔽氨, name需要一個(gè)類型藐唠,它從字符串常量 Sam 的默認(rèn)類型中獲取帆疟。**
有沒有辦法創(chuàng)建一個(gè)帶類型的常量?答案是可以的宇立。以下代碼創(chuàng)建一個(gè)有類型常量踪宠。

const typedhello string = "Hello World"

上面代碼中, typedhello 就是一個(gè) string 類型的常量妈嘹。

Go 是一個(gè)強(qiáng)類型的語言柳琢,在分配過程中混合類型是不允許的。讓我們通過以下程序看看這句話是什么意思润脸。

package main

func main() {  
        var defaultName = "Sam" // 允許
        type myString string
        var customName myString = "Sam" // 允許
        customName = defaultName // 不允許

}

在上面的代碼中柬脸,我們首先創(chuàng)建一個(gè)變量 defaultName 并分配一個(gè)常量 Sam常量 Sam 的默認(rèn)類型是 string 毙驯,所以在賦值后defaultNamestring 類型的倒堕。
下一行矛物,我們將創(chuàng)建一個(gè)新類型 myString漱挚,它是 string 的別名娩践。
然后我們創(chuàng)建一個(gè) myString 的變量 customName 并且給他賦值一個(gè)常量 Sam 瘩例。因?yàn)槌A?Sam 是無類型的详幽,它可以分配給任何字符串變量畜份。因此這個(gè)賦值是允許的隅很,customName 的類型是 myString寄症。

現(xiàn)在序愚,我們有一個(gè)類型為 string 的變量 defaultName 和另一個(gè)類型為 myString 的變量 customName憔披。即使我們知道這個(gè) myStringstring 類型的別名。Go 的類型策略不允許將一種類型的變量賦值給另一種類型的變量爸吮。因此將 defaultName 賦值給 customName 是不允許的活逆,編譯器會(huì)拋出一個(gè)錯(cuò)誤 main.go:7:20: cannot use defaultName (type string) as type myString in assignmen

布爾常量

布爾常量和字符串常量沒有什么不同拗胜。他們是兩個(gè)無類型的常量 truefalse蔗候。字符串常量的規(guī)則適用于布爾常量,所以在這里我們不再重復(fù)埂软。以下是解釋布爾常量的簡單程序锈遥。

package main

func main() {  
    const trueConst = true
    type myBool bool
    var defaultBool = trueConst // 允許
    var customBool myBool = trueConst // 允許
    defaultBool = customBool // 不允許
}

上面的程序是自我解釋的。

數(shù)字常量

數(shù)字常量包含整數(shù)勘畔、浮點(diǎn)數(shù)和復(fù)數(shù)的常量所灸。數(shù)字常量中有一些微妙之處。
讓我們看一些例子來說清楚炫七。

package main

import (  
    "fmt"
)

func main() {  
    const a = 5
    var intVar int = a
    var int32Var int32 = a
    var float64Var float64 = a
    var complex64Var complex64 = a
    fmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var)
}

上面的程序爬立,常量 a 是沒有類型的,它的值是 5 万哪。您可能想知道 a 的默認(rèn)類型是什么侠驯,如果它確實(shí)有一個(gè)的話, 那么我們?nèi)绾螌⑺峙浣o不同類型的變量抡秆。答案在于 a 的語法。下面的程序?qū)⑹故虑楦忧逦?/p>

package main

import (  
    "fmt"
)

func main() {  
    var i = 5
    var f = 5.6
    var c = 5 + 6i
    fmt.Printf("i's type %T, f's type %T, c's type %T", i, f, c)

}

在上面的程序中吟策,每個(gè)變量的類型由數(shù)字常量的語法決定儒士。5 在語法中是整數(shù), 5.6 是浮點(diǎn)數(shù)檩坚,5+6i 的語法是復(fù)數(shù)着撩。當(dāng)我們運(yùn)行上面的程序,它會(huì)打印出 i's type int, f's type float64, c's type complex128匾委。
現(xiàn)在我希望下面的程序能夠正確的工作拖叙。

package main

import (  
    "fmt"
)

func main() {  
    const a = 5
    var intVar int = a
    var int32Var int32 = a
    var float64Var float64 = a
    var complex64Var complex64 = a
    fmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var)
}

在這個(gè)程序中, a 的值是 5 赂乐,a 的語法是通用的(它可以代表一個(gè)浮點(diǎn)數(shù)薯鳍、整數(shù)甚至是一個(gè)沒有虛部的復(fù)數(shù)),因此可以將其分配給任何兼容的類型沪猴。這些常量的默認(rèn)類型可以被認(rèn)為是根據(jù)上下文在運(yùn)行中生成的。 var intVar int = a 要求 aint采章,所以它變成一個(gè) int 常量运嗜。 var complex64Var complex64 = a 要求 acomplex64,因此它變成一個(gè)復(fù)數(shù)類型悯舟。很簡單的:)担租。

枚舉

常量還可以用作枚舉, 如下數(shù)字 0、1 和 2 分別代表未知性別抵怎、女性和男性

const (
    Unknown = 0
    Female = 1
    Male = 2
)

關(guān)鍵字iota奋救,這個(gè)關(guān)鍵字用來聲明enum的時(shí)候采用,它默認(rèn)開始值是0反惕,const中每增加一行加1:

const (
    x = iota // x == 0
    y  // y == 1
    z  // z == 2
    w //w ==3
)
func main() {
    fmt.Println(x,y,z,w)
}

位運(yùn)算方式

const (
    Open = 1 << iota //1
    Close //2
    Pending //4
)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尝艘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姿染,更是在濱河造成了極大的恐慌背亥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悬赏,死亡現(xiàn)場離奇詭異狡汉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闽颇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門盾戴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兵多,你說我怎么就攤上這事尖啡¢掀停” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵可婶,是天一觀的道長沿癞。 經(jīng)常有香客問我,道長矛渴,這世上最難降的妖魔是什么椎扬? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮具温,結(jié)果婚禮上蚕涤,老公的妹妹穿的比我還像新娘。我一直安慰自己铣猩,他們只是感情好揖铜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著达皿,像睡著了一般天吓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峦椰,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天龄寞,我揣著相機(jī)與錄音,去河邊找鬼汤功。 笑死物邑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滔金。 我是一名探鬼主播色解,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼餐茵!你這毒婦竟也來了科阎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤忿族,失蹤者是張志新(化名)和其女友劉穎萧恕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肠阱,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡票唆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屹徘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片走趋。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖噪伊,靈堂內(nèi)的尸體忽然破棺而出簿煌,到底是詐尸還是另有隱情氮唯,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布姨伟,位于F島的核電站惩琉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏夺荒。R本人自食惡果不足惜瞒渠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望技扼。 院中可真熱鬧伍玖,春花似錦、人聲如沸剿吻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丽旅。三九已至椰棘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榄笙,已是汗流浹背邪狞。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留办斑,地道東北人外恕。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓杆逗,卻偏偏與公主長得像乡翅,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罪郊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354