Golang教程:(五)常量
原文:https://golangbot.com/constants/ 这是本Golang系列教程的第五篇。 定义常量常量(constant)表示固定的值,比如: 考虑如下程序: var a int = 50
var b string = "I love Go"
上面的程序中, a 和 b 分别被赋值为常量 关键字 const 修饰的名字为常量,不能被重新赋予任何值。 因此下面的程序会报错:cannot assign to a。 package main
func main() {
const a = 55 //allowed
a = 89 //reassignment not allowed
}
常量的值必须在编译期间确定。因此不能将函数的返回值赋给常量,因为函数调用发生在运行期。 package main
import (
"fmt"
"math"
)
func main() {
fmt.Println("Hello,playground")
var a = math.Sqrt(4)//allowed
const b = math.Sqrt(4)//not allowed
}
在上面的程序中,a 是一个变量因此可以被赋值为函数 字符串常量字符串常量最简单的常量,通过了解字符串常量可以更好的理解常量的概念。 在Go中任何用双引号( 字符串常量是什么类型呢?答案是 无类型(untyped)。 像 const hello = "Hello World"
上面的代码将 下面的代码中,变量 package main
import (
"fmt"
)
func main() {
fmt.Println("Hello,playground")
var name = "Sam" // 译者注:这里编译器需要推导出 name 的类型,
// 那么它是如何从无类型的常量 "Sam" 中获取类型的呢?
fmt.Printf("type %T value %v",name,name)
}
答案是无类型常量有一个默认的类型,当且仅当代码中需要无类型常量提供类型时,它才会提供该默认类型。在语句 (译者注:这里可以理解为常量是无类型的,但是在需要类型的场合,编译器会根据常量的值和上下文将常量转换为相应的类型。) 有没有办法创建一个有类型(typed)的常量?答案是:Yes。下面的代码创建了一个有类型常量。 const typedhello string = "Hello World"
上面的代码中, typedhello 是一个字符串类型的常量。 Go是强类型语言。在赋值时混合使用类型是不允许的。让我们通过以下代码说明这是什么意思。 package main
func main() {
var defaultName = "Sam" //allowed
type myString string
var customName myString = "Sam" //allowed
customName = defaultName //not allowed
}
在上面的代码中,我们首先创建了一个变量 下一行我们创建了一个新的类型 (译者注:可以通过 type NewType Type 的语法来创建一个新的类型。类似 C 语言的 typedef 。) 接着我们创建了一个名为 现在我们有两个变量: 布尔常量布尔常量与字符串常量(在概念上)没有区别。布尔常量只包含两个值:true 和 false。字符串常量的规则也同样适用于布尔常量,这里不再赘述。下面的代码解释了布尔常量: package main
func main() {
const trueConst = true
type myBool bool
var defaultBool = trueConst //allowed
var customBool myBool = trueConst //allowed
defaultBool = customBool //not allowed
}
上面的程序很好理解,这里就不过多解释了。 数值常量数值常量(Numeric constants)包括整数,浮点数以及复数常量。数值常量有一些微妙之处。 让我们看一些例子使事情变得明朗。 package main
import (
"fmt"
)
func main() {
fmt.Println("Hello,playground")
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)
}
上面的程序中, package main
import (
"fmt"
)
func main() {
fmt.Println("Hello,playground")
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)
}
在上面的程序中,所有变量的类型都是由数值常量决定的。在语法上看,5 在是一个整数,5.6 是一个浮点数, 5 + 6i 是一个复数。运行上面的程序,输出为: (译者注:编译器可以根据字面值常量的表现形式来确定它的默认类型,比如 现在应该很清楚下面的程序是如何工作的了: package main
import (
"fmt"
)
func main() {
fmt.Println("Hello,complex64Var)
}
在这个程序中, 数值表达式数值常量可以在表达式中自由的混合和匹配,仅当将它们赋值给变量或者在代码中明确需要类型的时候,才需要他们的类型。 package main
import (
"fmt"
)
func main() {
var a = 5.9/8
fmt.Printf("a's type %T value %v",a,a)
}
在上面的程序中,语法上 常量的介绍到此结束。 目录 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |