









变量的值可以在运行时随时改变,但有些值从定义开始他就不应该变。例如圆周率、程序版本号、一周的天数。这类值用常量来表示,Go 用 const 声明
PRTCL // GO
const Pi = 3.14159
const AppName = "MyApp"
const MaxRetry = 3
常量声明之后不能修改,强行赋值会报错:
PRTCL // GO
const Pi = 3.14159
Pi = 3.14 // 报错:cannot assign to Pi
常量也可以指定类型:
PRTCL // GO
const Pi float64 = 3.14159
const MaxRetry int = 3
不指定类型的常量叫无类型常量,灵活性更高,后面会讲
多个常量可以用括号一起声明:
PRTCL // GO
const (
AppName = "MyApp"
Version = "1.0.0"
MaxRetry = 3
)
常量只能是编译阶段就能确定的值,不能是运行时才能得到的结果:
PRTCL // GO
const now = time.Now() // 报错,time.Now() 是运行时才能得到的值
能用作常量的值:字符串字面量、数字字面量、布尔值、以及由这些构成的表达式:
PRTCL // GO
const (
A = 1
B = 2
C = A + B // ✅ 编译阶段就能算出来
)
常量没有声明了必须使用的限制,这点和变量不同:
PRTCL // GO
const unused = 42
// 不使用也不报错
不指定类型的常量叫无类型常量,它在被使用时才确定类型:
PRTCL // GO
const x = 42
var a int = x // x 当作 int 用
var b float64 = x // x 当作 float64 用
var c int32 = x // x 当作 int32 用
如果 x 是有类型的常量,这样赋值就要显式转换:
PRTCL // GO
const x int = 42
var b float64 = float64(x) // 必须转换
无类型常量的好处是灵活,不需要反复转换类型,标准库里大量使用这个特性
无类型常量有自己的默认类型,在必须确定类型的场合使用默认类型:
PRTCL // GO
const x = 42 // 默认类型 int
const f = 3.14 // 默认类型 float64
const s = "hello" // 默认类型 string
const b = true // 默认类型 bool
iota 是常量声明里的一个特殊计数器,只能在 const 块里用
每个 const 块开始时,iota 从 0 开始,每声明一个常量自动加 1:
PRTCL // GO
const (
A = iota // 0
B = iota // 1
C = iota // 2
)
通常简写,后面的常量重复使用同一个表达式:
PRTCL // GO
const (
A = iota // 0
B // 1,自动复用上一行的表达式
C // 2
)
每次新建一个 const 块,iota 重置为 0:
PRTCL // GO
const (
A = iota // 0
B // 1
)
const (
C = iota // 0,新的 const 块,iota 重置
D // 1
)
用来定义枚举
Go 没有专门的枚举类型,用 iota 模拟:
PRTCL // GO
type Weekday int
const (
Sunday Weekday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
type Weekday int 定义了一个新类型,底层是 int,但类型不同,不能混用,更安全
用 _ 跳过不需要的值:
PRTCL // GO
const (
_ = iota // 0,跳过
KB = 1 << (10 * iota) // 1 << 10 = 1024
MB // 1 << 20 = 1048576
GB // 1 << 30 = 1073741824
TB // 1 << 40
)
这里用位移运算来定义文件大小单位,1 << 10 是 1024,1 << 20 是 1024²,以此类推
从非零值开始
PRTCL // GO
const (
A = iota + 1 // 1
B // 2
C // 3
)
iota 用在表达式里
iota 可以参与任何表达式:
PRTCL // GO
const (
A = iota * 2 // 0
B // 2
C // 4
D // 6
)
中间插入非 iota 常量,计数不停
PRTCL // GO
const (
A = iota // 0
B = 100 // 100,但 iota 此时是 1
C = iota // 2,iota 继续计数
)
iota 不管你中间有没有用它,这必扬的都在自己计数
iota 只能在 const 块里用
PRTCL // GO
var x = iota // 报错,iota 只能在 const 里用
同一行的多个常量共用同一个 iota 值
PRTCL // GO
const (
A, B = iota, iota + 1 // A=0, B=1,同一行 iota 都是 0
C, D // C=1, D=2
)
同一行声明多个常量,iota 值相同,不会在同一行内递增
HTTP 状态码:
PRTCL // GO
const (
StatusOK = 200
StatusNotFound = 404
StatusError = 500
)
用户角色:
PRTCL // GO
type Role int
const (
RoleGuest Role = iota
RoleUser
RoleAdmin
)
错误码:
PRTCL // GO
type ErrCode int
const (
ErrOK ErrCode = 0
ErrUnknown ErrCode = iota + 1000 // 从 1001 开始
ErrTimeout
ErrNotFound
)
下一篇讲类型转换,Go 不做隐式转换,所有转换必须明确写出来,strconv 包怎么用,以及转换时的常见问题
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。