原文: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
布尔常量
布尔常量与字符串常量(在概念上)没有区别。布尔常量只包含两个值:true 和 false。字符串常量的规则也同样适用于布尔常量,这里不再赘述。下面的代码解释了布尔常量:
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
常量的介绍到此结束。