- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
03.5 Go 常量
常量是的值是不能改变的,Go使用关键字const
定义常量。
通常来说,常量是全局变量。因此,当你的代码中出现大量在局部定义的常量时,你就应该考虑重新设计你的代码了。
显而易见,使用常量的好处就是保证了该值不会在程序运行过程中被修改!
严格来说,常量的值在编译期间就被确定了。在这种情况下,Go可以使用布尔类型、字符串、或者数字类型存储常量的值。
你可以使用下面的代码定义常量:
const HEIGHT = 200
另外,你还可以一次性定义多个常量:
const (
C1 = "C1C1C1"
C2 = "C2C2C2"
C3 = "C3C3C3"
)
下面这三种声明变量的方式在Go看来是一样的:
s1 := "My String"
var s2 = "My String"
var s3 string = "My String"
以上三个变量的声明并没有使用const
关键字,所以它们并不是常量。这并不意味着你不能使用相似的方式定义两个常量:
const s1 = "My String"
const s2 string = "My String"
尽管s1
和s2
都是常量,但是s2
定义时声明了其类型,意味着它比常量s1
的定义更加严格。这是因为一个声明类型的Go常量必须遵循与声明过类型的变量相同的严格规则,换句话说,未声明类型的常量无需遵循严格规则,使用起来会更加自由。但是,即使在定义常量时没有声明其类型,Go会根据其值判断其类型,因为你不想在使用该常量时考虑所有的规则。下面我们将用一个简单的例子来说明,当你为常量赋予具体类型时会遇到哪些问题:
const s1 = 123
const s2 float64 = 123
var v1 float32 = s1*12
var v2 float32 = s2*12
编译器正常通过v1
的声明及初始化,但是由于s2
和v2
的类型不同,编译器就会报错:
$ go run a.go
$ command-line-argument
./a.go:12:6: canot use s2 * 12 (type float64) as type float32 in assignment
代码建议:如果你要用到许多常量,最好将它们定义到同一个包中。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论