Bootstrap

Go学习笔记——常量

背景——凡事都要有个背景

年前,给自己定了几个flag,其中包含初步掌握一门新的后端语言。当时定的方向是Java或者Go,考虑到C#和Java有很多相通的地方,而且最新的dotnet core框架和java的spring boot很像,想着深入学习一下Java。但转念一想,Java虽然对我来说,可能上手难度会更低一些,但其庞大且成熟的生态圈子,对后期的学习肯定会造成一定的阻力,而且,投入进去后,我可能很难同时兼顾C#和java两个方向,而且我当下的工作用的是微软的技术栈,以dotnet为主,所以还是想考虑以下其他的方向。

而当前go的市场异常火热,属于高速发展期,生态圈子初成,包括go语言自身也在不断地更新迭代,在高速发展期切入进去,后续go的生态圈子肯定会慢慢完善,而我自己在使用和学习go的过程中也会逐步了解go的生态圈。所以从各方面来将,当下还是适合抄底go语言方向~

正题之前

我的学习笔记,只是单纯的笔记,因为我看书或者文章时看着看着会走神,用这种方式来强迫自己入定学习,也会有一点点个人的总结,所以,大神请指教。然后学习路径是极客时间上Tony Bai老师的《》,因为本身没有go基础,不知道课好不好,我是看着挺容易理解的,这里也实名推荐一下这门课~

笔记内容

一、常量的好处

二、go语言中常量的创新

package main
import "fmt"

const n = 1 //定义无类型常量,根据初始值会给n定义成int类型

func main() {
  var a int = 5
  fmt.printIn(a + n) //输出6
}

隐式转型说的就是,对于无类型常量参与的表达式求值,Go 编译器会根据上下文中的类型信息,把无类型常量自动转换为相应的类型后,再参与求值计算,这一转型动作是隐式进行的。

--摘自《》第14讲中关于常量创新点的介绍

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 自身也是一个无类型常量,可以像前面我们提到的无类型常量那样,自动参与到不同类型的求值过程中来,不需要我们再对它进行显式转型操作。

--摘自《》第14讲中关于常量创新点的介绍

这个例子,把三种场景整到一个例子里来了,偷个懒,懂得都懂。

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也会跟着变化
}

嗯,这节差不多就这些~