《Go 语言第一课》课程学习笔记(九)

这篇具有很好参考价值的文章主要介绍了《Go 语言第一课》课程学习笔记(九)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常量:Go 在“常量”设计上的创新有哪些?

  • Go 语言在常量方面的创新包括下面这几点:
    • 支持无类型常量;
    • 支持隐式自动转型;
    • 可用于实现枚举。

常量

  • Go 语言的常量是一种在源码编译期间被创建的语法元素。这是在说这个元素的值可以像变量那样被初始化,但它的初始化表达式必须是在编译期间可以求出值来的。
    • Go 常量一旦声明并被初始化后,它的值在整个程序的生命周期内便保持不变。
    • 我们在并发设计时不用考虑常量访问的同步,并且被创建并初始化后的常量还可以作为其他常量的初始表达式的一部分。
  • Go 是使用 var 关键字声明变量的。在常量这里,Go 语言引入 const 关键字来声明常量。而且,和 var 支持单行声明多个变量,以及以代码块形式聚合变量声明一样,const 也支持单行声明多个常量,以及以代码块形式聚合常量声明的形式:
    const Pi float64 = 3.14159265358979323846 // 单行常量声明
    // 以 const 代码块形式声明常量
    const (
    	size int64 = 4096
    	i, j, s = 13, 14, "bar" // 单行声明多个常量
    )
    
  • Go 语言规范规定,Go 常量的类型只局限于 Go 基本数据类型,包括数值类型、字符串类型,以及只有两个取值(true 和 false)的布尔类型。

无类型常量

  • Go 语言对类型安全是有严格要求的:即便两个类型拥有着相同的底层类型,但它们仍然是不同的数据类型,不可以被相互比较或混在一个表达式中进行运算。这一要求不仅仅适用于变量,也同样适用于有类型常量(Typed Constant)中。
  • 有类型常量与变量混合在一起进行运算求值的时候,也必须遵守类型相同这一要求,否则我们只能通过显式转型才能让代码正常工作。
  • 常量在声明时并没有显式地被赋予类型,在 Go 中,这样的常量就被称为无类型常量(Untyped Constant)。
  • 无类型常量也不是说就真的没有类型,它也有自己的默认类型,不过它的默认类型是根据它的初值形式来决定的。

隐式转型

  • 隐式转型说的就是,对于无类型常量参与的表达式求值,Go 编译器会根据上下文中的类型信息,把无类型常量自动转换为相应的类型后,再参与求值计算,这一转型动作是隐式进行的。
  • 但由于转型的对象是一个常量,所以这并不会引发类型安全问题,Go 编译器会保证这一转型的安全性。

实现枚举

  • Go 语言其实并没有原生提供枚举类型,在 Go语言中,我们可以使用 const 代码块定义的常量集合,来实现枚举。
  • 首先,Go 的 const 语法提供了“隐式重复前一个非空表达式”的机制:
    const (
    	Apple, Banana = 11, 22
    	Strawberry, Grape
    	Pear, Watermelon
    )
    
    • 这个代码里,常量定义的后两行并没有被显式地赋予初始值,所以 Go 编译器就为它们自动使用上一行的表达式:
      const (
      	Apple, Banana = 11, 22
      	Strawberry, Grape = 11, 22
      	Pear, Watermelon = 11, 22
      )
      
    • 不过,仅仅是重复上一行显然无法满足“枚举”的要求,因为枚举类型中的每个枚举常量的值都是唯一的。所以,Go 在这个特性的基础上又提供了“神器”:iota。
      • iota 是 Go 语言的一个预定义标识符,它表示的是 const 声明块(包括单行声明)中,每个常量所处位置在块中的偏移值(从零开始)。
      • 同时,每一行中的 iota 自身也是一个无类型常量,可以自动参与到不同类型的求值过程中来,不需要我们再对它进行显式转型操作。
        const (
        	Apple, Banana = iota, iota + 10 // 0, 10 (iota = 0)
        	Strawberry, Grape // 1, 11 (iota = 1)
        	Pear, Watermelon // 2, 12 (iota = 2)
        )
        
    • 如果一个 Go 源文件中有多个 const 代码块定义的不同枚举,每个 const 代码块中的 iota 也是独立变化的,也就是说,每个 const 代码块都拥有属于自己的 iota。
    • 每个 iota 的生命周期都始于一个 const 代码块的开始,在该 const 代码块结束时结束。

文章来源地址https://www.toymoban.com/news/detail-664629.html

到了这里,关于《Go 语言第一课》课程学习笔记(九)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Go 语言第一课》课程学习笔记(十二)

    在 Go 语言中,函数是唯一一种基于特定输入,实现特定任务并可返回任务执行结果的代码块(Go 语言中的方法本质上也是函数)。 在 Go 中,我们定义一个函数的最常用方式就是使用函数声明。 第一部分是 func,Go 函数声明必须以 func 开始。 第二部分是函数名。

    2024年02月11日
    浏览(49)
  • 《Go 语言第一课》课程学习笔记(五)

    Go 语言中有一个特殊的函数:main 包中的 main 函数,也就是 main.main,它是所有 Go 可执行程序的用户层执行逻辑的入口函数。 Go 程序在用户层面的执行逻辑,会在这个函数内按照它的调用顺序展开。 main 函数的函数原型非常简单,没有参数也没有返回值。 Go 语言要求:可执行

    2024年02月12日
    浏览(44)
  • C语言入门课程学习笔记-6

    本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程,图片全部来源于课程PPT,仅用于个人学习记录 D,越界 C D 20 2 0 -1 A wrong 赋值越界 B str2[4]初始化为0元素 A wrong C AD strlen(s) ij j– 10 3 abc

    2024年04月28日
    浏览(36)
  • [Go]-Go语言第一课

    1-1 Go语言特点 1-2 Go语言优势与劣势 1-3 Linux下的安装 1-4 Linux下的环境变量 2-1 Go语言-工作区和GOPATH 2-2 Go语言-源码文件的分类和含义 2-34 Go语言-代码包的相关知识 3-1 go run 命令简介 goc2p项目地址:https://github.com/hyper-carrot/goc2p 用go编写了ds和pds,用以打印目录结构 3-4 go run 常用标

    2024年02月09日
    浏览(40)
  • Ubuntu学习---跟着绍发学linux课程记录(第一部分)

    Ubuntu的学习过程的笔记分为4个部分来记录: 1、Ubuntu学习—跟着绍发学linux课程记录(第1部分) 2、Ubuntu学习—跟着绍发学linux课程记录(第2部分) 3、Ubuntu学习—跟着绍发学linux课程记录(第3部分) 4、Ubuntu学习—跟着绍发学linux课程记录(第4部分) 视频链接: Ubuntu 21.04乌班

    2024年02月10日
    浏览(32)
  • 尚硅谷webpack课程学习笔记

    为什么需要使用打包工具? 开发时使用的框架、es6 语法 、less 等浏览器无法识别。 需要经过编译成浏览器能识别的css、js才可以运行。 打包工具可以帮我们编译,还可以做代码压缩、兼容处理、性能优化。 常见的打包工具有什么? vite、webpack、glup、grunt webapck最基本的使用

    2024年02月07日
    浏览(50)
  • 【学习笔记】黑马程序员Java课程学习笔记(更新至第12章---集合)

    Java语言是美国Sun公司(Stanford University Network)在1995年推出的计算机语言, 2009年Oracle甲骨文公司收购Sun公司。Java之父:詹姆斯·高斯林(James Gosling)。 Java可以在任意操作系统上运行,Windows、Mac、Linux。我们只需要在运行Java应用程序的操作系统上,安装一个与操作系统对应

    2024年02月07日
    浏览(47)
  • 《Kubernetes入门实战课》课程学习笔记(一)

    现在 Kubernetes 已经没有了实际意义上的竞争对手,它的地位就如同 Linux 一样,成为了事实上的云原生操作系统,是构建现代应用的基石。 现代应用是什么? 是微服务,是服务网格,这些统统要围绕着容器来开发、部署和运行。 使用容器就必然要用到容器编排技术,在现在只

    2024年02月17日
    浏览(72)
  • 《MySQL 实战 45 讲》课程学习笔记(四)

    索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。 哈希表 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。 哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位

    2024年02月14日
    浏览(45)
  • 《Redis 核心技术与实战》课程学习笔记(一)

    为了保证数据的可靠性,Redis 需要在磁盘上读写 AOF 和 RDB,但在高并发场景里,这就会直接带来两个新问题: 一个是写 AOF 和 RDB 会造成 Redis 性能抖动; 另一个是 Redis 集群数据同步和实例恢复时,读 RDB 比较慢,限制了同步和恢复速度。 其实,一个可行的解决方案就是使用

    2024年02月12日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包