首页 > 其他分享 >Go语言精进之路读书笔记第17条——理解Go语言表达式的求值顺序

Go语言精进之路读书笔记第17条——理解Go语言表达式的求值顺序

时间:2024-02-07 17:58:37浏览次数:36  
标签:case 初始化 变量 读书笔记 求值 Go 语句 表达式

Go语言表达式

  • 支持在同一行声明和初始化多个变量
  • 支持在同一行对多个变量进行赋值(不同类型也可以)
var a, b, c = 5, "hello", 3.45
a, b, c := 5, "hello", 3.45

a, b, c = 5, " hello", 3.45

Rob Pike 练习题(规则见17.3 赋值语句的求值)

n0, n1 = n0+n1, n0
或者
n0, n1 = op(n0, n1), n0

17.1 包级别变量声明语句中的表达式求值顺序

  • 包级别变量按照声明的先后顺序进行初始化
  • 如果某个变量直接或间接依赖其他变量,那么初始化顺序排在依赖的变量后面
  • 未初始化且不含对应初始化表达式或初始化表达式不依赖任何初始化变量的变量,称之为"ready for initialization"变量
  • 逐步初始化"ready for initialization"变量
  • 先处理的文件中的变量顺序在前
  • 特殊情况:
    1. 空变量(_)一视同仁
    2. 多个变量在声明语句左侧且右侧为单一表达式时,无论左侧那个变量被初始化,同一行的其他变量也会被一并初始化

17.2 普通求值顺序

普通求值顺序(usual order):Go规定表达式操作数中的所有函数、方法以及channel操作按照从左到右的次序进行求值

特殊情况2,右侧非单一表达式的情况下,需要将声明语句等价转换

17.3 赋值语句的求值

赋值语句求值分为两个阶段:

  • 第一阶段,对于等号左边的下标表达式、指针解引用表达式和等号右边表达式中的操作数,按照普通求值规则从左到右进行求值;
  • 第二阶段,按从左到右的顺序对变量进行赋值。

17.4 switch/select语句中的表达式求值

switch-case/select-case语句中的表达式求值属于"惰性求值"范畴。惰性求值指的是需要进行求值时才会对表达式进行求值。

  • switch-case例子中,Expre(3)和Expre(4)被略过
  • select-case例子中,首先所有case表达式都会被按出现的先后顺序求值一遍,除了位于case等号左边的从channel接收数据的case,该case等号左边的表达式在接收前才会被求值。

标签:case,初始化,变量,读书笔记,求值,Go,语句,表达式
From: https://www.cnblogs.com/brynchen/p/18011143

相关文章

  • Go语言精进之路读书笔记第18条——理解Go语言代码块与作用域
    18.1Go代码块与作用域简介Go规范定义了如下几种隐式代码块。宇宙代(Universe)码块:所有Go源码都在该隐式代码块中,就相当于所有Go代码等最外层都存在一对大括号。包代码块:每个包都有一个包代码块,其中放置着该包都所有Go源码文件夹代码块:每个文件都有一个文件代码块,其中包含着该......
  • Go语言精进之路读书笔记第15条——了解string实现原理并高效使用
    15.1Go语言的字符串类型在Go语言中,无论是字符串常量、字符串变量还是代码中出现的字符串字面量,它们的类型都被统一设置为string特点string类型的数据是不可变的对string进行切片化后,Go编译器会为切片变量重新分配底层存储而不是共用string的底层存储string的底层的数据存......
  • Go语言精进之路读书笔记第16条——理解Go语言的包导入
    Go编译速度快的原因主要体现在以下三方面:Go要求每个源文件在开头处显式地列出所有依赖的包导入,这样Go编译器不必读取和处理整个文件就可以确定其依赖的包列表。Go要求包之间不能存在循环依赖。这样一个包的依赖关系便形成了一张有向无环图。由于无环,包可以被单独编译,也可以并行......
  • Django知识笔记1
    本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计RESTAPI,通过使用Django来实现一个RESTAPI为例,明确后端开发RESTAPI要做的最核心工作,然后介绍DjangoRESTframework能帮助我们简化开发RESTAPI的工作。Web应用模式在开发Web应用中,有两种应用模式:前后端不分离......
  • Go语言精进之路读书笔记第14条——了解map实现原理并高效使用
    14.1什么是mapmap对value的类型没有限制,但是对key的类型有严格要求:key的类型应该严格定义了作为“==”和“!=”两个操作符的操作数时的行为,因此func、map、slice、chan不能作为map的key类型。map类型不支持“零值可用”,未显式赋初值的map类型变量的零值为nil。对处于零值状态的......
  • golang类型转换模块之gconv
    gf框架提供了非常强大的类型转换包gconv,可以实现将任何数据类型转换为指定的数据类型,对常用基本数据类型之间的无缝转换,同时也支持任意类型到struct对象的属性赋值。由于gconv模块内部大量使用了断言而非反射(仅struct转换使用到了反射),因此执行的效率非常高。使用方式:import"g......
  • Go语言的For循环:语法全解析
    Go语言,作为一门旨在提供简洁、高效编程体验的编程语言,其循环结构的设计同样体现了这一理念。在Go中,for循环是唯一的循环语句,但它的灵活性足以应对各种迭代需求。本文将详细介绍Go语言中for循环的语法,通过示例展示其在实际编程中的应用。基本语法Go语言的for循环基本语法如下:for初......
  • 详解golang实现一个带时效的环形队列
    1.需求mysql执行时间超过100ms以上打warn日志,但是一分钟以内这种warn日志超过10条就需要告警。所以需求就是获得一分钟以内mysql的warn的个数。2.分析为什么使用环形队列而不使用slice?因为队列长度固定,所以可以一开始就分配好空间,不用自动扩容,环形的目的就是不用改变数组的值,只用移......
  • Go语言的100个错误使用场景(30-40)|数据类型与字符串使用
    目录前言4.控制结构4.1忽视元素在range循环中是拷贝(#30)4.2忽略在range循环中如何评估表达式(#31)4.3忽略在range中使用指针元素的影响(#32)4.4对map遍历的错误假设(#33)4.5忽略break的作用(#34)4.6在循环中使用defer(#35)5.字符串5.1不理解rune的概念(#36)5.2不准确的字......
  • golang定时器之timer+ticker
    转载: https://juejin.cn/post/7327157426298011663 Timer是一个一次性的定时器,用于在未来的某一时刻执行一次操作。基本使用创建Timer定时器的方式有两种:NewTimer(dDuration)*Timer:该函数接受一个time.Duration类型的参数d(时间间隔),表示定时器在过期之前等待的......