Golang教程:常量
定義常量
常量(constant)表示固定的值,比如:5,-89,"I love Go",67.89?等等。
考慮如下程序:
var a int = 50 var b string = "I love Go"上面的程序中, a 和 b 分別被賦值為常量?50?和?"I love Go"。關(guān)鍵字?const?用于指示常量,如?50?和?"I love Go"。在上面的代碼中,盡管沒(méi)有使用關(guān)鍵字?const?修飾?50?與?"I love Go",但它們?cè)贕o的內(nèi)部表示為常量。
關(guān)鍵字?const?修飾的名字為常量,不能被重新賦予任何值。 因此下面的程序會(huì)報(bào)錯(cuò):cannot assign to a。
package mainfunc main() { const a = 55 //alloweda = 89 //reassignment not allowed }常量的值必須在編譯期間確定。因此不能將函數(shù)的返回值賦給常量,因?yàn)楹瘮?shù)調(diào)用發(fā)生在運(yùn)行期。
package mainimport ( "fmt""math" )func main() { fmt.Println("Hello, playground")var a = math.Sqrt(4)//allowedconst b = math.Sqrt(4)//not allowed }在上面的程序中,a 是一個(gè)變量因此可以被賦值為函數(shù)?math.Sqrt(4)?的調(diào)用結(jié)果。(我們將在單獨(dú)的教程中更詳細(xì)的討論函數(shù))。而 b 是一個(gè)常量,它的值必須在編譯期間確定,但是函數(shù)?math.Sqrt(4)?的調(diào)用結(jié)果只能在運(yùn)行時(shí)被計(jì)算出來(lái),因此在編譯?const b = math.Sqrt(4)?時(shí)將會(huì)報(bào)錯(cuò):error main.go:11: const initializer math.Sqrt(4) is not a constant.
字符串常量
字符串常量最簡(jiǎn)單的常量,通過(guò)了解字符串常量可以更好的理解常量的概念。
在Go中任何用雙引號(hào)(")括起來(lái)的值都是字符串常量,比如?"Hello World","Sam"?都是字符串常量。
字符串常量是什么類型呢?答案是?無(wú)類型(untyped)。
像?"Hello World"?這樣的字符串沒(méi)有任何類型。
const hello = "Hello World"上面的代碼將?"Hello World"?賦給一個(gè)名為?hello?的常量。那么現(xiàn)在常量?hello?是不是就有了類型?答案是:No。hello仍然沒(méi)有類型。
下面的代碼中,變量?name?被賦值為一個(gè)無(wú)類型的常量?"Sam",它是如何工作的呢?
package mainimport ( "fmt" )func main() { fmt.Println("Hello, playground")var name = "Sam" // 譯者注:這里編譯器需要推導(dǎo)出 name 的類型,// 那么它是如何從無(wú)類型的常量 "Sam" 中獲取類型的呢?fmt.Printf("type %T value %v", name, name)}答案是無(wú)類型常量有一個(gè)默認(rèn)的類型,當(dāng)且僅當(dāng)代碼中需要無(wú)類型常量提供類型時(shí),它才會(huì)提供該默認(rèn)類型。在語(yǔ)句?var name = "Sam"?中,name需要一個(gè)類型,因此它從常量?"Sam"?中獲取其默認(rèn)類型:string。
有沒(méi)有辦法創(chuàng)建一個(gè)有類型(typed)的常量?答案是:Yes。下面的代碼創(chuàng)建了一個(gè)有類型常量
const typedhello string = "Hello World"上面的代碼中,?typedhello?是一個(gè)字符串類型的常量。
Go是強(qiáng)類型語(yǔ)言。在賦值時(shí)混合使用類型是不允許的。讓我們通過(guò)以下代碼說(shuō)明這是什么意思。
package mainfunc main() { var defaultName = "Sam" //allowedtype myString stringvar customName myString = "Sam" //allowedcustomName = defaultName //not allowed }在上面的代碼中,我們首先創(chuàng)建了一個(gè)變量?defaultName?并且賦值為常量?"Sam"。常量?"Sam"?的默認(rèn)類型為?string,因此賦值之后,defaultName?的類型亦為?string。
下一行我們創(chuàng)建了一個(gè)新的類型?myString,它是?string?的別名。
(譯者注:可以通過(guò)?type NewType Type?的語(yǔ)法來(lái)創(chuàng)建一個(gè)新的類型。類似 C 語(yǔ)言的 typedef 。)
接著我們創(chuàng)建了一個(gè)名為?customName?的?myString?類型的變量,并將常量?"Sam"?賦給它。因?yàn)槌A?"Sam"?是無(wú)類型的所以可以將它賦值給任何字符串變量。因此這個(gè)賦值是合法的,customName?的類型是?myString。
現(xiàn)在我們有兩個(gè)變量:string?類型的?defaultName?和?myString?類型的?customName。盡管我們知道?myString?是?string的一個(gè)別名,但是Go的強(qiáng)類型機(jī)制不允許將一個(gè)類型的變量賦值給另一個(gè)類型的變量。因此,?customName = defaultName?這個(gè)賦值是不允許的,編譯器會(huì)報(bào)錯(cuò):main.go:10: cannot use defaultName (type string) as type myString in assignment
布爾常量
布爾常量與字符串常量(在概念上)沒(méi)有區(qū)別。布爾常量只包含兩個(gè)值:true?和?false。字符串常量的規(guī)則也同樣適用于布爾常量,這里不再贅述。下面的代碼解釋了布爾常量:
package mainfunc main() { const trueConst = truetype myBool boolvar defaultBool = trueConst //allowedvar customBool myBool = trueConst //alloweddefaultBool = customBool //not allowed }上面的程序很好理解,這里就不過(guò)多解釋了。
數(shù)值常量
數(shù)值常量(Numeric constants)包括整數(shù),浮點(diǎn)數(shù)以及復(fù)數(shù)常量。數(shù)值常量有一些微妙之處。
讓我們看一些例子使事情變得明朗。
package mainimport ( "fmt" )func main() { fmt.Println("Hello, playground")const a = 5var intVar int = avar int32Var int32 = avar float64Var float64 = avar complex64Var complex64 = afmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var) }上面的程序中,const a?是無(wú)類型的,值為?5。你也許想知道?a?的默認(rèn)類型是什么?如果它有默認(rèn)類型,那么它是怎么賦值給其他類型的變量的??答案在于使用?a?時(shí)的上下文。我們暫時(shí)放下這兩個(gè)問(wèn)題,先來(lái)看下面的程序:
package mainimport ( "fmt" )func main() { fmt.Println("Hello, playground")var i = 5var f = 5.6var c = 5 + 6ifmt.Printf("i's type %T, f's type %T, c's type %T", i, f, c) }在上面的程序中,所有變量的類型都是由數(shù)值常量決定的。在語(yǔ)法上看,5?在是一個(gè)整數(shù),5.6?是一個(gè)浮點(diǎn)數(shù),?5 + 6i?是一個(gè)復(fù)數(shù)。運(yùn)行上面的程序,輸出為:i's type int, f's type float64, c's type complex128
(譯者注:編譯器可以根據(jù)字面值常量的表現(xiàn)形式來(lái)確定它的默認(rèn)類型,比如?5.6?表現(xiàn)為浮點(diǎn)數(shù),因此它的默認(rèn)類型為?float64?,而?"Sam"?表現(xiàn)為字符串,因此它的默認(rèn)類型為?stirng。)
現(xiàn)在應(yīng)該很清楚下面的程序是如何工作的了:
package mainimport ( "fmt" )func main() { fmt.Println("Hello, playground")const a = 5var intVar int = avar int32Var int32 = avar float64Var float64 = avar complex64Var complex64 = afmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var) }?
在這個(gè)程序中,a?的值是?5?并且?a?在語(yǔ)法上是泛化的(它既可以表示浮點(diǎn)數(shù)?5.0,也可以表示整數(shù)?5,甚至可以表示沒(méi)有虛部的復(fù)數(shù)?5 + 0i),因此?a?可以賦值給任何與之類型兼容的變量。像?a?這種數(shù)值常量的默認(rèn)類型可以想象成是通過(guò)上下文動(dòng)態(tài)生成的。var intVar int = a?要求?a?是一個(gè)?int,那么?a?就變成一個(gè)?int?常量。var complex64Var complex64 = a?要求?a?是一個(gè)?complex64,那么?a?就變成一個(gè)?complex64?常量。這很容易理解:)
數(shù)值表達(dá)式
數(shù)值常量可以在表達(dá)式中自由的混合和匹配,僅當(dāng)將它們賦值給變量或者在代碼中明確需要類型的時(shí)候,才需要他們的類型。
package mainimport ( "fmt" )func main() { var a = 5.9/8fmt.Printf("a's type %T value %v",a, a) }在上面的程序中,語(yǔ)法上?5.9?是一個(gè)浮點(diǎn)數(shù),8?是一個(gè)整數(shù)。因?yàn)樗鼈兌际菙?shù)值常量,因此?5.9/8?是合法的。相除的結(jié)果為?0.7375,是一個(gè)浮點(diǎn)數(shù)。因此變量?a?的類型為浮點(diǎn)型。上面的程序輸出為:a's type float64 value 0.7375
?
?
?
?
本文摘自:https://blog.csdn.net/u011304970/article/details/74857146
轉(zhuǎn)載于:https://www.cnblogs.com/liuzhongchao/p/9158748.html
總結(jié)
以上是生活随笔為你收集整理的Golang教程:常量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C#如何生成缩略图、水印
- 下一篇: python接口自动化测试三:代码发送H