写点什么

Go 学习笔记——常量

作者:为自己带盐
  • 2022 年 2 月 14 日
  • 本文字数:1640 字

    阅读完需:约 5 分钟

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


年前,给自己定了几个 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 基础,不知道课好不好,我是看着挺容易理解的,这里也实名推荐一下这门课~


笔记内容

一、常量的好处

  1. 编译初期被创建,整个生命周期内值不变,好处是并发场景,不用考虑常量的同步,这一点和其他语言的常量定义基本是一样的

  2. 原生支持,类型安全

  3. go 语言提供了多种关于常量的创新点,便于不同场景的应用,这里我个人最喜欢用常量来实现枚举的特性。

二、go 语言中常量的创新

  1. 无类型常量,顾名思义,即看起来没有定义数值类型的常量(这里还要提一点,go 语言的常量定义只支持字符串,数值和布尔类型),但实际会根据初始值自动赋予数值类型。

package mainimport "fmt"
const n = 1 //定义无类型常量,根据初始值会给n定义成int类型
func main() { var a int = 5 fmt.printIn(a + n) //输出6}
复制代码


  1. 隐式转换

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

--摘自《Go语言第一课》第 14 讲中关于常量创新点的介绍

package mainimport "fmt"
type myInt int //自定义数值类型,底层为int
const n = 2 //定义无类型常量,根据初始值会给n定义成int类型
func main() { var a myInt = 5 fmt.printIn(a + n) //输出7}
复制代码



  1. 实现枚举

  • go 语言原生并没有枚举类型(enum)

  • Go 的 const 语法提供了“隐式重复前一个非空表达式”的机制

  • Go 在上述特性的基础上又提供了“神器”:iota,

iota 是 Go 语言的一个预定义标识符,它表示的是 const 声明块(包括单行声明)中,每个常量所处位置在块中的偏移值(从零开始)。同时,每一行中的 iota 自身也是一个无类型常量,可以像前面我们提到的无类型常量那样,自动参与到不同类型的求值过程中来,不需要我们再对它进行显式转型操作。

--摘自《Go语言第一课》第 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也会跟着变化}
复制代码


发布于: 2 小时前阅读数: 5
用户头像

学着码代码,学着码人生。 2019.04.11 加入

狂奔的小码农

评论

发布
暂无评论
Go学习笔记——常量