日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Golang教程:常量

發(fā)布時(shí)間:2023/12/20 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Golang教程:常量 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

定義常量

常量(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"。在上面的代碼中,盡管沒有使用關(guān)鍵字?const?修飾?50?與?"I love Go",但它們在Go的內(nèi)部表示為常量。

關(guān)鍵字?const?修飾的名字為常量,不能被重新賦予任何值。 因此下面的程序會報(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ì)算出來,因此在編譯?const b = math.Sqrt(4)?時(shí)將會報(bào)錯(cuò):error main.go:11: const initializer math.Sqrt(4) is not a constant.

字符串常量

字符串常量最簡單的常量,通過了解字符串常量可以更好的理解常量的概念。

在Go中任何用雙引號(")括起來的值都是字符串常量,比如?"Hello World","Sam"?都是字符串常量。

字符串常量是什么類型呢?答案是?無類型(untyped)。

像?"Hello World"?這樣的字符串沒有任何類型。

const hello = "Hello World"

上面的代碼將?"Hello World"?賦給一個(gè)名為?hello?的常量。那么現(xiàn)在常量?hello?是不是就有了類型?答案是:No。hello仍然沒有類型。

下面的代碼中,變量?name?被賦值為一個(gè)無類型的常量?"Sam",它是如何工作的呢?

package mainimport ( "fmt" )func main() { fmt.Println("Hello, playground")var name = "Sam" // 譯者注:這里編譯器需要推導(dǎo)出 name 的類型,// 那么它是如何從無類型的常量 "Sam" 中獲取類型的呢?fmt.Printf("type %T value %v", name, name)}

答案是無類型常量有一個(gè)默認(rèn)的類型,當(dāng)且僅當(dāng)代碼中需要無類型常量提供類型時(shí),它才會提供該默認(rèn)類型。在語句?var name = "Sam"?中,name需要一個(gè)類型,因此它從常量?"Sam"?中獲取其默認(rèn)類型:string。

有沒有辦法創(chuàng)建一個(gè)有類型(typed)的常量?答案是:Yes。下面的代碼創(chuàng)建了一個(gè)有類型常量

const typedhello string = "Hello World"

上面的代碼中,?typedhello?是一個(gè)字符串類型的常量。

Go是強(qiáng)類型語言。在賦值時(shí)混合使用類型是不允許的。讓我們通過以下代碼說明這是什么意思。

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?的別名。

譯者注:可以通過?type NewType Type?的語法來創(chuàng)建一個(gè)新的類型。類似 C 語言的 typedef 。

接著我們創(chuàng)建了一個(gè)名為?customName?的?myString?類型的變量,并將常量?"Sam"?賦給它。因?yàn)槌A?"Sam"?是無類型的所以可以將它賦值給任何字符串變量。因此這個(gè)賦值是合法的,customName?的類型是?myString。

現(xiàn)在我們有兩個(gè)變量:string?類型的?defaultName?和?myString?類型的?customName。盡管我們知道?myString?是?string的一個(gè)別名,但是Go的強(qiáng)類型機(jī)制不允許將一個(gè)類型的變量賦值給另一個(gè)類型的變量。因此,?customName = defaultName?這個(gè)賦值是不允許的,編譯器會報(bào)錯(cuò):main.go:10: cannot use defaultName (type string) as type myString in assignment

布爾常量

布爾常量與字符串常量(在概念上)沒有區(qū)別。布爾常量只包含兩個(gè)值:true?和?false。字符串常量的規(guī)則也同樣適用于布爾常量,這里不再贅述。下面的代碼解釋了布爾常量:

package mainfunc main() { const trueConst = truetype myBool boolvar defaultBool = trueConst //allowedvar customBool myBool = trueConst //alloweddefaultBool = customBool //not allowed }

上面的程序很好理解,這里就不過多解釋了。

數(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?是無類型的,值為?5。你也許想知道?a?的默認(rèn)類型是什么?如果它有默認(rèn)類型,那么它是怎么賦值給其他類型的變量的??答案在于使用?a?時(shí)的上下文。我們暫時(shí)放下這兩個(gè)問題,先來看下面的程序:

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ù)值常量決定的。在語法上看,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)形式來確定它的默認(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?在語法上是泛化的(它既可以表示浮點(diǎn)數(shù)?5.0,也可以表示整數(shù)?5,甚至可以表示沒有虛部的復(fù)數(shù)?5 + 0i),因此?a?可以賦值給任何與之類型兼容的變量。像?a?這種數(shù)值常量的默認(rèn)類型可以想象成是通過上下文動態(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) }

在上面的程序中,語法上?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教程:常量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。