GolangStudy/src/study/day5/const.go

93 lines
2.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package main
import (
"fmt"
"math"
"time"
)
//type IP byte
// 常量表达式的值在编译期计算,而不是在运行期。
// 每种常量的潜在类型都是基础类型boolean、string或数字。
func main() {
const (
PI = 3.14
e = 2.72
)
fmt.Println(math.Pi)
fmt.Println(math.E)
fmt.Println(PI)
fmt.Println(e)
// 所有常量的运算都可以在编译期完成,这样可以减少运行时的工作,
// 也方便其他编译优化。当操作数是常量时,
// 一些运行时的错误也可以在编译时被发现,
// 例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。
// 常量间的所有算术运算、逻辑运算和比较运算的结果也是常量,
// 对常量的类型转换操作或以下函数调用都是返回常量结果:
// len、cap、real、imag、complex和unsafe.Sizeof§13.1)。
// 因为它们的值是在编译期就确定的,因此常量可以是构成类型的一部分,
// 例如用于指定数组类型的长度:
//const IPv4Len = 4
// parseIPv4 parses an IPv4 address (d.d.d.d).
//parseIPv4 := func(s string) IP {
// var p [IPv4Len]byte
// // ...
// return p
//}
// 一个常量的声明也可以包含一个类型和一个值,但是如果没有显式指明类型,
// 那么将从右边的表达式推断类型。在下面的代码中,
// time.Duration是一个命名类型底层类型是int64time.Minute是对应类型的常量。
// 下面声明的两个常量都是time.Duration类型可以通过%T参数打印类型信息
const noDelay time.Duration = 0
const timeout = 5 * time.Minute
fmt.Printf("%T %[1]v\n", noDelay) // "time.Duration 0"
fmt.Printf("%T %[1]v\n", timeout) // "time.Duration 5m0s"
fmt.Printf("%T %[1]v\n", time.Minute) // "time.Duration 1m0s"
// 如果是批量声明的常量,除了第一个外其它的常量右边的初始化表达式都可以省略,
// 如果省略初始化表达式则表示使用前面常量的初始化表达式写法,对应的常量类型也一样的。例如:
const (
a = 1
b
c = 2
d
)
fmt.Println(a, b, c, d) // "1 1 2 2"
// 下面是来自time包的例子它首先定义了一个Weekday命名类型
// 然后为一周的每天定义了一个常量从周日0开始。在其它编程语言中
// 这种类型一般被称为枚举类型。
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
fmt.Printf("%T %[1]v \n", Sunday)
// 下面是一个更复杂的例子每个常量都是1024的幂
const (
_ = 1 << (10 * iota)
KiB // 1024
MiB // 1048576
GiB // 1073741824
TiB // 1099511627776 (exceeds 1 << 32)
PiB // 1125899906842624
EiB // 1152921504606846976
ZiB // 1180591620717411303424 (exceeds 1 << 64)
YiB // 1208925819614629174706176
)
fmt.Println(KiB)
}