操作系統(tǒng):centos8;golang版本:1.17.4
關(guān)鍵字 const 被用于表示常量,常量的值會在編譯的時候確定,常量不能再重新賦值為其他的值。
例如,以下代碼會出現(xiàn)一個編譯錯誤:cannot assign to temp (declared const)
package main
import "fmt"
func main() {
const temp = 1
temp = 2
}
定義常量有兩種方式:
(1) const temp = 1 ,這種情況下temp是無類型的。
(2) const temp int = 1 ,這種情況下temp是int類型的。
存儲在常量中的數(shù)據(jù)類型只可以是布爾型、數(shù)字型(整數(shù)型、浮點(diǎn)型和復(fù)數(shù))和字符串型。
1、字符串常量
const hello = "hello world"
上面定義的hello常量是沒有類型的。
go是一門強(qiáng)類型語言,所有的變量必須有明確的類型。而無類型的常量有一個與它們相關(guān)聯(lián)的默認(rèn)類型,當(dāng)且僅當(dāng)一行代碼需要時才提供它。
例如,當(dāng)我們把常量hello賦值給變量name時,var name = hello ,使用了hello的默認(rèn)類型string。
2、布爾常量
布爾常量的規(guī)則與字符串常量相同,定義無類型布爾常量時有默認(rèn)類型,也可以定義有類型的布爾常量。
3、數(shù)字常量
數(shù)字常量的規(guī)則有一些不同。例如下面一段代碼:
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 。而每個變量的類型由數(shù)字常量的語法決定。a 的語法是通用的(它可以代表一個浮點(diǎn)數(shù)、整數(shù)甚至是一個沒有虛部的復(fù)數(shù)),因此可以將其分配給任何兼容的類型。這些常量的默認(rèn)類型可以被認(rèn)為是根據(jù)上下文在運(yùn)行中生成的。 var intVar int = a 要求 a 是 int,所以它變成一個 int 常量。 var complex64Var complex64 = a 要求 a 是 complex64,因此它變成一個復(fù)數(shù)類型。
這個程序的運(yùn)行結(jié)果為:
intVar 5
int32Var 5
float64Var 5
complex64Var (5+0i)
4、數(shù)字表達(dá)式
數(shù)字常量可以在表達(dá)式中自由混合和匹配,只有當(dāng)它們被分配給變量或者在需要類型的代碼中的任何地方使用時,才需要類型。例如:
package main
import (
"fmt"
)
func main() {
var a = 6.66 / 8
fmt.Printf("a's type %T value %v", a, a)
}
在上面的程序中, 6.66 在語法中是浮點(diǎn)型,8 是整型,6.66/8 是允許的,因?yàn)閮蓚€都是數(shù)字常量。除法的結(jié)果是 0.8325 是一個浮點(diǎn)型,所以 a 的類型是浮點(diǎn)型。這個程序的輸出結(jié)果是: a's type float64 value 0.8325 。