Go学习笔记——常量
背景——凡事都要有个背景
年前,给自己定了几个flag,其中包含初步掌握一门新的后端语言。当时定的方向是Java或者Go,考虑到C#和Java有很多相通的地方,而且最新的dotnet core框架和java的spring boot很像,想着深入学习一下Java。但转念一想,Java虽然对我来说,可能上手难度会更低一些,但其庞大且成熟的生态圈子,对后期的学习肯定会造成一定的阻力,而且,投入进去后,我可能很难同时兼顾C#和java两个方向,而且我当下的工作用的是微软的技术栈,以dotnet为主,所以还是想考虑以下其他的方向。
而当前go的市场异常火热,属于高速发展期,生态圈子初成,包括go语言自身也在不断地更新迭代,在高速发展期切入进去,后续go的生态圈子肯定会慢慢完善,而我自己在使用和学习go的过程中也会逐步了解go的生态圈。所以从各方面来将,当下还是适合抄底go语言方向~
正题之前

笔记内容
一、常量的好处
二、go语言中常量的创新
package main
import "fmt"
const n = 1 //定义无类型常量,根据初始值会给n定义成int类型
func main() {
var a int = 5
fmt.printIn(a + n) //输出6
}

隐式转型说的就是,对于无类型常量参与的表达式求值,Go 编译器会根据上下文中的类型信息,把无类型常量自动转换为相应的类型后,再参与求值计算,这一转型动作是隐式进行的。
package main
import "fmt"
type myInt int //自定义数值类型,底层为int
const n = 2 //定义无类型常量,根据初始值会给n定义成int类型
func main() {
var a myInt = 5
fmt.printIn(a + n) //输出7
}

go语言原生并没有枚举类型(enum)
Go 的 const 语法提供了“隐式重复前一个非空表达式”的机制
Go 在上述特性的基础上又提供了“神器”:iota,
iota 是 Go 语言的一个预定义标识符,它表示的是 const 声明块(包括单行声明)中,每个常量所处位置在块中的偏移值(从零开始)。同时,每一行中的 iota 自身也是一个无类型常量,可以像前面我们提到的无类型常量那样,自动参与到不同类型的求值过程中来,不需要我们再对它进行显式转型操作。
这个例子,把三种场景整到一个例子里来了,偷个懒,懂得都懂。
package main
import "fmt"
const (
Apple, Banana = iota, iota + 10 // 0, 10 (iota = 0)
Strawberry, Grape // 1, 11 (iota = 1)
Pear, Watermelon // 2, 12 (iota = 2)
)
const (
_ = iota // 0,空白白字符
Pin1
Pin2
Pin3
_ //使用空白字符,略过Pin4,但后续Pin5的值仍然按时5,效仿标准库代码$GOROOT/src/syscall/net_js.go
Pin5 // 5
)
//iota比较好的应用场景,比如,开始的枚举类型只有X,M,L,而后续如果要添加新的尺码,只需在对应的枚举中增加新类型即可
//而之前的方式则需要将所有的常量都手动修改
const (
_ = iota
S
M
//XM
L
)
func main() {
fmt.Println(Apple)
fmt.Println(Banana)
fmt.Println(Pear)
fmt.Println(Watermelon)
fmt.Println(Pin1)
fmt.Println(Pin5)
fmt.Println(S)
fmt.Println(L) //可以在放开XM的注释后,查看L也会跟着变化
}
嗯,这节差不多就这些~