Study for Go ! Chapter two - Expression
Study for Go ! Chapter two - Expression
1. Keyword
Golang仅有 25 个保留关键字,体现了 golang 语法规则的简洁性
保留关键字不能用作常量、变量、函数名、以及结构字段等标识符
2. Operator
Golang 中没有乘幂和绝对值运算符,对应的是标准库 math 里的 Pow、Abs 函数实现
一元运算符的优先级最高
二元运算符有五个级别从高到低分别是:
相同优先级的二元运算符,从左到右依次计算
使用二元运算符,除了位移操作以外,操作数类型必须相同,如果其中一个是无显式类型声明的常量,那么该常量操作数会自动转型
位移右操作数必须是无符号整数,或者可以转换的无显式类型常量
如果是非常量位移表达式,那么会优先将无显式类型的常量左操作数转型
位运算符
Attention:
在 golang 中自增、自减不再是运算符,而是作为独立语句存在,不能用于表达式使用
表达式通常式 求值代码,可以作为右值或者参数使用,而语句完成一个行为,比如 if、 for 代码块,表达式可以作为语句使用,但是语句却不能当作表达式
Pointer:
不能将内存地址与指针混为一谈
内存地址是内存中每个字节单元的唯一编号,而指针则是一个实体
指针会被分配内存空间,相当于一个专门用来保存地址的整型变量
取值运算符 “ & ” 用于获取对象地址
指针运算符 “ * ” 用于间接引用目标对象
二级指针 **T, 如果包含包名则写成 *package.T
并非所有对象都能进行取地址操作,但是变量总是能够正确返回 (addressable),指针运算符为左值时,我们可更新目标对象状态,为右值时,我们可以获取目标对象状态
指针支持相等运算符,但不能做加减法运算和类型转换,如果两个指针指向同一地址,或者都为nil,那么它们相等
Attention:
可以通过 unsafe.Pointer 将指针转换为 uintptr 后进行加减法运算,但可能会导致非法访问
Pointer 类似C 语言中的 void* 万能指针, 可以用来转换指针类型。他能安全持有对象和对象成员,但是 uintptr 不行。uintptr 仅是一种特殊类型, 并不用于目标对象, 无法组织垃圾回收器回收对象内存
Golang 中没有专门指向成员的 " -> " 运算符, 统一使用 “ . ” 选择表达式
Zero - size:
零长度 (zero - size)对象的地址是否相等和具体的实现版本有关,但是肯定不等于 nil
即使长度为 0 ,可该对象依然时合法存在的,拥有合法的内存地址,这与 nil 语义完全不同
在 runtime/malloc.go 里有个 zerobase 全局变量, 所有通过 mallocgc 分配的零长度对象都使用该地址
3. Initialization
对复合类型(slice、array、map、struct)变量初试化时,有一些语法限制
初始化表达式必须包含类型标签
左花括号必须在类型尾部,不能另起一行
多个成员初始值以逗号分割
允许多行,但每行以逗号或者右花括号结束
4. Flow Control
Golang 精简(合并)了流控制语句,虽然某些时候不够便捷,但是够用
if...else...
条件表达式值必须是 bool 类型,可以省略括号,但是左花括号不能另起一行
支持初始化语句,可定义块局部变量或执行初始化函数
Attention:
上示例中,if 块承担了两种逻辑:错误处理和后续正常操作。
基于重构原则,我们应该保持代码块功能的单一性
如此,if 块仅完成条件检查和错误处理,相关正常逻辑保持在同一层次。
这样做便于代码的阅读,也提升了代码的可维护性,更利于拆分重构
如果需要在多个条件块中使用局部变量,那么只能保留原层次,或者直接使用外部变量
对于某些过于复杂的组合条件,建议将其重构为函数
函数调用虽然有一些性能损失,但是却让主流程变得更加清爽,更易于测试,改善代码 可维护性
Notice:
将流程和局部细节分离是一个很好的习惯
不同的变化因素被分隔在各自独立单元(函数或者模块)内,可以避免修改时造成关联错误,减少患“ 肥胖症 ”的函数数量
switch
条件表达式支持非常量值,使得 golang 比C更加灵活。相比于if表达式, switch值列表更加简洁
编译器对if、switch 生成的机器指令可能完全相同,所谓谁的性能更好看具体情况而定
switch 同样支持初始化语句,按照从上到下,从左到右匹配case执行,只有全部匹配失败时才会执行default块
无需显式执行 break 语句, case执行完毕后自动中断,如要继续访问后续 case (源码顺序),需要执行 fallthrough 关键字,但是不再进行条件表达式匹配
Attention:
fallthrough 必须放在 case 块的结尾,可被 break 语句阻止
如果 fallthrough 放在 default 后面,因为会按照源码执行顺序执行所以不会执行 default 导致错误
Notice:
某些时候,switch 被用来替换 if 语句, 被省略的 switch 条件表达式默认为 true,继而与 case 比较表达式结果匹配
switch 有时候也用于接口类型匹配
for
golang 中仅有 for 这一种循环语句
初始化语句仅能被执行一次,条件表达式中如果有函数调用,要先确认是否会被重复执行
如果存在重复执行的函数,则可能会被编译器优化掉,也可能是动态结果须每次执行确认
处理上述问题的办法是,创建临时变量保存该函数结果
使用 for...range 完成数据迭代支持 string、array、pointer、array pointer、slice、map、channel等类型,返回索引、键值数据
允许返回单指(次数),或用 “ _ ” 忽略
无论是 for 还是 for...range 迭代,其中定义的局部变量都会被重复使用(地址相同),但这样会对闭包有一些影响
Attention
使用 range 时会先复制要迭代的目标数据,再在复制体中区取值,所以会影响数组的 range 使用因此建议使用数组指针或者切片类型去代替
在 range 的复制问题中,string、slice 的基本结构都是很小的结构体,而 map、channel 本身时指针封装,它们的复制成本都很小,无须专门优化
如果 range 的目标表达式时函数调用,那也仅被执行一次
goto、continue、break
使用 goto 前,需要先定义标签。标签区分大小写,且未使用的标签会引发编译错误
不能使用 goto 跳转到其他函数或者内层代码块内
break 和 continue 用于终端代码块的执行
配合标签, break 和 continue 可以在多层嵌套中 指定目标层级
Study for Go ! Chapter two - Expression的更多相关文章
- Spring对IOC的理解
一.IOC控制反转和DI依赖注入 1.控制反转,字面可以理解为:主动权的转移,原来一个应用程序内的对象是类通过new去主动创建并实例化的,对对像创建的主动权在程序代码中.程序不仅要管理业务逻辑也要管理 ...
- 【转载】【时序约束学习笔记1】Vivado入门与提高--第12讲 时序分析中的基本概念和术语
时序分析中的基本概念和术语 Basic concept and Terminology of Timing Analysis 原文标题及网址: [时序约束学习笔记1]Vivado入门与提高--第12讲 ...
- spring 笔记2:Spring MVC : Did not find handler method for 问题的解决
日志显示为: Looking up handler method for path /***Did not find handler method for [/***]No mapping found ...
- Expression.Blend.4 Chapter 图片和视频的使用
原文:Expression.Blend.4 Chapter 图片和视频的使用 翻译的地方可能有错误,欢迎大家指正.但是里面每一个程序都是亲自测试过,并加了点自己的看法. 我翻译的是Expression ...
- Expression.Blend.4 Chapter 接口设计
原文:Expression.Blend.4 Chapter 接口设计 发现网上关于silverlight,WPF美工系列的书籍一直很少,而且很多都是英文的.在公司无聊,开始进行翻译. 翻译的地方可能有 ...
- 零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术
原文:零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术 本章所介绍的是便利且快速的内建工具Clone ? 本章所介绍的是便利且 ...
- 零元学Expression Design 4 - Chapter 5 教你如何用自制笔刷在5分钟内做出设计感效果
原文:零元学Expression Design 4 - Chapter 5 教你如何用自制笔刷在5分钟内做出设计感效果 本章将教你如何运用笔刷与简单线条,只要5分钟,就能做出设计感效果 ? 本章将教你 ...
- 零元学Expression Design 4 - Chapter 6 教你如何在5分钟内做出文字立体感效果
原文:零元学Expression Design 4 - Chapter 6 教你如何在5分钟内做出文字立体感效果 又来一篇五分钟做设计啦~ 本篇将教大家如何运用Design内建工具Blend Path ...
- 零元学Expression Design 4 - Chapter 4 教你如何自制超炫笔刷
原文:零元学Expression Design 4 - Chapter 4 教你如何自制超炫笔刷 在Chapter 2 有稍微讲过Design内建笔刷的用法,本章将教大家如何自制独一无二的笔刷,并且重 ...
- 零元学Expression Design 4 - Chapter 3 看小光被包围了!!如何活用「Text On Path」设计效果
原文:零元学Expression Design 4 - Chapter 3 看小光被包围了!!如何活用「Text On Path」设计效果 本章将教大家如何活用「Text On Path」,做出文绕图 ...
随机推荐
- SQL语句查询关键字:where筛选、group by分组、distinc去重、order by排序、limit分页、操作表的SQL语句布补充
目录 SQL语句查询关键字 前期数据准备 编写SQL语句的小技巧 查询关键字之where筛选 查询关键字之group by分组 查询关键字之having过滤 查询关键字值distinct去重 查询关键 ...
- pythonfloat优雅的四舍五入
开发中经常会有float四舍五入转int的需求,先看看浮点数直接转int的情形:无论如何float直接转int都不会四舍五入,而是直接抹去小数点. 这个需求很简单,实现也很简单,看过网友的实现,都不够 ...
- 物以类聚人以群分,通过GensimLda文本聚类构建人工智能个性化推荐系统(Python3.10)
众所周知,个性化推荐系统能够根据用户的兴趣.偏好等信息向用户推荐相关内容,使得用户更感兴趣,从而提升用户体验,提高用户粘度,之前我们曾经使用协同过滤算法构建过个性化推荐系统,但基于显式反馈的算法就会有 ...
- 一文读懂 Kubernetes 存储设计
在 Docker 的设计中,容器内的文件是临时存放的,并且随着容器的删除,容器内部的数据也会一同被清空.不过,我们可以通过在 docker run 启动容器时,使用 --volume/-v 参数来指定 ...
- Kafka初学习
Kafka初学习 摘要:在之前的消息队列学习中,我已经了解了消息队列的基本概念以及基本用法,同时也了解到了市面上的几款消息队列中间件,其中我了解到了卡夫卡这款消息队列中间件是一款最为快速的消息队列 ...
- P8796 [蓝桥杯 2022 国 AC] 替换字符
题面 给定一个仅含小写英文字母的字符串 \(s\) 和 \(m\) 次操作,每次操作选择一个区间 \([l_i,r_i]\) 将 \(s\) 的该区间中的所有字母 \(x_i\) 全部替换成字母 \( ...
- Ansible 学习笔记 - 定位主机和组的模式
中英文对照表 英文 中文 备注 host 主机 group (主机)组 pattern 模式 ad hoc 特别命令 playbook 剧本 Ansible 专有名词,一段复杂的编排 inventor ...
- day06-Spring管理Bean-IOC-04
Spring管理Bean-IOC-04 3.基于注解配置bean 3.1基本使用 3.1.1说明 基本说明:基于注解的方式配置bean,主要是项目开发中的组件,比如Controller,Service ...
- C Primer Plus(4.8)編程練習
/*C Primer Plus (4.7) 5*/ 1 include<stdio.h> 2 #define BOOK "War and Peace" 3 int ma ...
- 自定义alert弹框,去掉IP以及端口号提示
最新版例子~~ 如果同时多个弹框,只显示第一个 <!DOCTYPE html> <html lang="en"> <head> <met ...