原文:https://golangbot.com/constants/

这是本Golang系列教程的第五篇。

定义常量
5-89"I love Go"67.89

考虑如下程序:

var a int = 50  
var b string = "I love Go"
50"I love Go"50"I love Go"50"I love Go"50"I love Go"

关键字 const 修饰的名字为常量,不能被重新赋予任何值。 因此下面的程序会报错:cannot assign to a

package mainfunc main() {  const a = 55 //alloweda = 89 //reassignment not allowed
}

常量的值必须在编译期间确定。因此不能将函数的返回值赋给常量,因为函数调用发生在运行期。

package mainimport (  "fmt""math"
)func main() {  fmt.Println("Hello, playground")var a = math.Sqrt(4)//allowedconst b = math.Sqrt(4)//not allowed
}
math.Sqrt(4)math.Sqrt(4)const b = math.Sqrt(4)error main.go:11: const initializer math.Sqrt(4) is not a constant.
字符串常量

字符串常量最简单的常量,通过了解字符串常量可以更好的理解常量的概念。

""Hello World""Sam"

字符串常量是什么类型呢?答案是 无类型(untyped)

"Hello World"
const hello = "Hello World" 
"Hello World"
name"Sam"
package mainimport (  "fmt"
)func main() {  fmt.Println("Hello, playground")var name = "Sam"  // 译者注:这里编译器需要推导出 name 的类型,// 那么它是如何从无类型的常量 "Sam" 中获取类型的呢?fmt.Printf("type %T value %v", name, name)}
var name = "Sam"name"Sam"

译者注:这里可以理解为常量是无类型的,但是在需要类型的场合,编译器会根据常量的值和上下文将常量转换为相应的类型。

有没有办法创建一个有类型(typed)的常量?答案是:Yes。下面的代码创建了一个有类型常量。

const typedhello string = "Hello World" 

上面的代码中, typedhello 是一个字符串类型的常量。

Go是强类型语言。在赋值时混合使用类型是不允许的。让我们通过以下代码说明这是什么意思。

package mainfunc main() {  var defaultName = "Sam" //allowedtype myString stringvar customName myString = "Sam" //allowedcustomName = defaultName //not allowed}
defaultName"Sam""Sam"stringdefaultNamestring
myStringstring

译者注:可以通过 type NewType Type 的语法来创建一个新的类型。类似 C 语言的 typedef 。

customNamemyString"Sam""Sam"customNamemyString
stringdefaultNamemyStringcustomNamemyStringstringcustomName = defaultNamemain.go:10: cannot use defaultName (type string) as type myString in assignment
布尔常量

布尔常量与字符串常量(在概念上)没有区别。布尔常量只包含两个值:truefalse。字符串常量的规则也同样适用于布尔常量,这里不再赘述。下面的代码解释了布尔常量:

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

上面的程序很好理解,这里就不过多解释了。

数值常量

数值常量(Numeric constants)包括整数,浮点数以及复数常量。数值常量有一些微妙之处。

让我们看一些例子使事情变得明朗。

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 a5aa
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)
}
i's type int, f's type float64, c's type complex128
5.6float64"Sam"stirng

现在应该很清楚下面的程序是如何工作的了:

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)
}
a5a5.055 + 0iaavar intVar int = aaintaintvar complex64Var complex64 = aacomplex64acomplex64
数值表达式

数值常量可以在表达式中自由的混合和匹配,仅当将它们赋值给变量或者在代码中明确需要类型的时候,才需要他们的类型。

package mainimport (  "fmt"
)func main() {  var a = 5.9/8fmt.Printf("a's type %T value %v",a, a)
}
5.985.9/80.7375aa's type float64 value 0.7375

常量的介绍到此结束。