当前位置: 首页 > news >正文

GO学习笔记之表达式

GO学习笔记之表达式

    • 保留字
    • 运算符
    • 优先级
    • 二元运算符
    • 位运算符
    • 自增
    • 指针

保留字

Go语言仅25个保留关键字(keyword),这是最常见的宣传语,虽不是主流语言中最少的,但也确实体现了Go语法规则的简洁性。保留关键字不能用作常量、变量、函数名,以及结构字段等标识符。

break   default    func   interface select
case    defer      go    map   struct
chan    else   goto   package    switch
const   fallthrough if    range      type
continue for   import     return       var

相比在更新版本中不停添加新语言功能,我更喜欢简单的语言设计。某些功能可通过类库扩展,或其他非侵入方式实现,完全没必要为了“方便”让语言变得臃肿。过于丰富的功能特征会随着时间的推移抬升门槛,还会让代码变得日趋“魔幻”,降低一致性和可维护性。

运算符

很久以前,流传“程序=算法+数据”这样的说法。
算法是什么?通俗点说就是“解决问题的过程”。小到加法指令,大到成千上万台服务器组成的分布式计算集群,抛去抽象概念和宏观架构,最终都由最基础的机器指令过程去处理不同层次存储设备里的数据。

学习语言和设计架构不同,我们所关心的就是微观层次,诸如语法规则所映射的机器指令,以及数据存储位置和格式等等。其中,运算符和表达式用来串联数据和指令,算是最基础的算法。
另有一句话:“硬件的方向是物理,软件的结局是数学。”
全部运算符及分隔符列表:

+      &       +=      &=       &&      ==      !=      (      ) 
-      |       -=      |=       ||      <       <=      [      ] 
*      ^       *=      ^=       <-      >       >=      {      } 
/      <<      /=      <<=      ++      =       :=      ,      ; 
%      >>      %=      >>=      --      !       ...     .      : &^              &^=

没有乘幂和绝对值运算符,对应的是标准库math里的Pow、Abs函数实现。

优先级

一元运算符优先级最高,二元则分成五个级别,从高往低分别是:
highest * / % << >> & &^ + - | ^ == != < <= > >= && lowest ||

相同优先级的二元运算符,从左往右依次计算。

二元运算符

除位移操作外,操作数类型必须相同。如果其中一个是无显式类型声明的常量,那么该常量操作数会自动转型。

func main() { const v=20            // 无显式类型声明的常量 var a byte=10b:=v+a                 //v自动转换为byte/uint8类型 fmt.Printf("%T, %v\n",b,b) const c float32=1.2d:=c+v         //v自动转换为float32类型 fmt.Printf("%T, %v\n",d,d) 
}
uint8,30
float32,21.2
func main() { b:=23            //b是有符号int类型变量 x:=1<<b     // 无效操作:1<<b(shift count type int,must be unsigned integer) println(x) 
}

位移右操作数必须是无符号整数,或可以转换的无显式类型常量。

如果是非常量位移表达式,那么会优先将无显式类型的常量左操作数转型。

func main() { a:=1.0<<3           // 常量表达式(包括常量展开) fmt.Printf("%T, %v\n",a,a)       //int,8var s uint=3b:=1.0<<s           // 无效操作:1<<s(shift of type float64) fmt.Printf("%T, %v\n",b,b)       // 因为b没有提供类型,那么编译器通过1.0推断, // 显然无法对浮点数做位移操作 var c int32=1.0<<s       // 自动将1.0转换为int32类型 fmt.Printf("%T, %v\n",c,c)       //int32,8
}

位运算符

二进制位运算符比较特别的就是“bit clear”,在其他语言里很少见到。

AND          按位与:都为1     a&b  0101&0011=0001
OR           按位或:至少一个1   a|b  0101|0011=0111
XOR          按位亦或:只有一个1     a^b  0101^0011=0110
NOT          按位取反   (一元)        ^a ^0111=1000
AND NOT      按位清除   (bit clear)  a&^b 0110&^1011=0100
LEFT SHIFT    位左移           a<<2 0001<<3=1000
RIGHT SHIFT       位右移           a>>2 1010>>2=0010

位清除(AND NOT)和位亦或(XOR)是不同的。它将左右操作数对应二进制位都为1的重置为0(有些类似位图),以达到一次清除多个标记位的目的。

const( read  byte=1<<iotawriteexecfreeze
) func main() { a:=read|write|freezeb:=read|freeze|execc:=a&^b     // 相当于a^read^freeze,但不包括execfmt.Printf("%04b&^ %04b= %04b\n",a,b,c) 
}

自增

自增、自减不再是运算符。只能作为独立语句,不能用于表达式。

指针

不能将内存地址与指针混为一谈。
内存地址是内存中每个字节单元的唯一编号,而指针则是一个实体。指针会分配内存空间,相当于一个专门用来保存地址的整型变量。

                    p:= &x                x:=100-----------------+--------+------\\-------+------+--------- memory ...     |0x1200|     ....      |100 |   ... -----------------+--------+------\\-------+------+--------- address       0x800                  0x1200

取址运算符“&”用于获取对象地址。
指针运算符“”用于间接引用目标对象。
二级指针**T,如包含包名则写成
package.T。
并非所有对象都能进行取地址操作,但变量总是能正确返回(addressable)。指针运算符为左值时,我们可更新目标对象状态;而为右值时则是为了获取目标状态。

func main() { x:=10var p*int= &x     // 获取地址,保存到指针变量 *p+=20           // 用指针间接引用,并更新对象 println(p, *p)       // 输出指针所存储的地址,以及目标对象 
}输出
0xc82003df30 30

指针类型支持相等运算符,但不能做加减法运算和类型转换。如果两个指针指向同一地址,或都为nil,那么它们相等。

func main() { x:=10p:= &xp++                    // 无效操作:p++ (non-numeric type*int) var p2*int=p+1  // 无效操作:p+1(mismatched types*int and int) p2= &xprintln(p==p2) 
}

可通过unsafe.Pointer将指针转换为uintptr后进行加减法运算,但可能会造成非法访问。
Pointer类似C语言中的void*万能指针,可用来转换指针类型。它能安全持有对象或对象成员,但uintptr不行。后者仅是一种特殊整型,并不引用目标对象,无法阻止垃圾回收器回收对象内存。
指针没有专门指向成员的“->”运算符,统一使用“.”选择表达式。

func main() { a:=struct{ x int}{} a.x=100p:= &ap.x+=100      // 相当于p->x+=100println(p.x) 
}

零长度(zero-size)对象的地址是否相等和具体的实现版本有关,不过肯定不等于nil。即便长度为0,可该对象依然是“合法存在”的,拥有合法内存地址,这与nil语义完全不同。
在runtime/malloc.go里有个zerobase全局变量,所有通过mallocgc分配的零长度对象都使用该地址。不过上例中,对象a、b在栈上分配,并未调用mallocgc函数。

func main() { var a,b struct{} println(&a, &b) println(&a== &b, &a==nil) 
}

运行结果:

0xc820041f2f 0xc820041f2f
true false

相关文章:

GO学习笔记之表达式

GO学习笔记之表达式 保留字运算符优先级二元运算符位运算符自增指针 保留字 Go语言仅25个保留关键字&#xff08;keyword&#xff09;&#xff0c;这是最常见的宣传语&#xff0c;虽不是主流语言中最少的&#xff0c;但也确实体现了Go语法规则的简洁性。保留关键字不能用作常量…...

005Mybatis返回值(ResultMap 一对多,多对多)

属性 id 应该总是指定一个或多个可以唯一标识结果的属性。 虽然&#xff0c;即使不指定这个属性&#xff0c;MyBatis 仍然可以工作&#xff0c;但是会产生严重的性能问题。 只需要指定可以唯一标识结果的最少属性。显然&#xff0c;你可以选择主键&#xff08;复合主键也可以…...

把玩数据在内存中的存储

前言&#xff1a;时光如梭&#x1f4a6;&#xff0c;今天到了C语言进阶啦&#x1f60e;&#xff0c;基础知识我们已经有了初步认识&#xff0c; 是时候该拔高拔高自己了&#x1f63c;。 目标&#xff1a;掌握浮点数在内存的存储&#xff0c;整形在内存的存储。 鸡汤&#xff1a…...

Nginx运行原理与基本配置文件讲解

文章目录 Nginx基本运行原理Nginx的基本配置文件serverlocationroot 与 alias 的区别server 和 location 中的 rootnginx欢迎页 本文参考文章Nginx相关文章 Nginx基本运行原理 Nginx的进程是使用经典的「Master-Worker」模型,Nginx在启动后&#xff0c;会有一个master进程和多个…...

openGauss5 企业版之SQL语法和数据结构

文章目录 1.openGauss SQL 语法2. 数据类型2.1数值类型2.2 布尔类型2.3 字符类型2.4 二进制类型2.5日期/时间类型2.6 几何类型2.7 网络地址类型2.8 位串类型2.9 文本搜索类型2.10 UUID数据类型2.11 JSON/JSONB类型2.11 HLL数据类型2.12 范围类型2.13 索引2.14 对象标识符类型2.…...

TClientDataSet 模拟 EXCEL表

日常处理数据时&#xff0c;经常需要&#xff0c;从EXCEL表格中&#xff0c;批量导入数据&#xff0c;通过 XLSReadWriteII编程&#xff0c;会很快导入。 但是&#xff0c;客户提供的EXCEL表的字段&#xff0c;数据格式&#xff0c;字段的排序&#xff0c;有很大的区别。因此&a…...

Hazel游戏引擎(012)GLFW窗口事件

文中若有代码、术语等错误&#xff0c;欢迎指正 文章目录 前言如何确定GLFW窗口事件的回调函数参数Application接收事件回调流程原项目流程(12345)自己写的简单Demo与流程(123) 前言 此节目的 为了完成008计划窗口事件的接收glfw窗口事件以及回调部分 此节要完成 使用glfw函数…...

Nenu算法复习第六章

目录 补充知识点 1160: 6001 第几天&#xff1f; 1161: 6002 时间格式转换 1162: 6003 星期几&#xff1f; 1163: 6004 18岁生日、 补充知识点 闰年的判断方法&#xff1a; 能被四整除但是不能一百整除或者能被400整除 例题: 题目描述 经常会有人问你怎么判断闰年&…...

知识付费社群:最好的知识传播方式

知识付费是一种网络内容付费方式&#xff0c;它让知识传播者通过网络以付费的方式向社会大众或特定平台传递知识、技能和智力资源。 知识付费传播的成功离不开用户&#xff0c;他们是核心节点&#xff0c;也是受众和粉丝的重要组成部分。用户不仅可以生产和传播知识&#xff0…...

局域网内不同网段的设备互相连接设置

目录 介绍1、打开网络连接&#xff0c;找到本地网络->属性->ipv4->属性->高级&#xff1a;2、在高级设置页面&#xff0c;我们添加一个IP&#xff0c;这个IP和板子在一个网段&#xff0c;我这里设置的是192.168.253.101&#xff1a;3、设置完成即可生效&#xff0c…...

LVS+Keepalived 群集

目录 一、keepalived概述 1.keepalived工作原理 2.keepalived体系主要模块及其作用 3.判断服务器主备&#xff0c;及如何配置浮动IP 二、keepalived的抢占与非抢占模式 三、部署LVSkeepalived 1.配置负载调度器&#xff08;主备相同&#xff09; 1.1配置keepalived&…...

windows系统cmd命令设置别名,并添加到环境变量

众所周知&#xff0c;Linux 命令很强大&#xff0c;使用起来也很方便&#xff0c;但是想在 windows 系统上使用 Linux 命令有些困难&#xff0c;要么下载第三方终端工具&#xff0c;要么就是安装一系列命令环境。 作为一个前端开发&#xff0c;其实可以全局安装一下 npm 命令行…...

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机) 目录 智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 Matlab实现GWO-SVM灰狼算法优化支持向量机的多输…...

java方法

文章目录 一、java方法总结 一、java方法 在前面几个章节中我们经常使用到 System.out.println()&#xff0c;那么它是什么呢&#xff1f; println() 是一个方法。 System 是系统类。 out 是标准输出对象。这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法 pr…...

LabVIEW与Space Wire配合开发

LabVIEW与Space Wire配合开发 Space Wire是欧洲航天局开发的一种高速、点对点、全双工的串行总线网络&#xff0c;以IEEE1355-1995和LVDS 两个商业标准为基础&#xff0c;汲取了1394技术、ATM技术、以太网技术的优点&#xff0c;同时考虑了空间应用的特点&#xff0c;在故障检…...

开始使用chat-gpt4

目录 一、说明 二、安装步骤 三、测试效果咋样 &#xff08;1&#xff09;写代码能力 &#xff08;2&#xff09;回答问题能力 &#xff08;3&#xff09;写作能力 一、说明 参考&#xff08;非常感谢这位博主的分享&#xff09;&#xff1a;http://t.csdn.cn/qypw9 注意&…...

算法之贪心算法

定义 总是做出当前最好的选择&#xff0c;期望通过局部最优选择得到全局最优的解决方案。 适用标准 贪心选择性质。 原问题的整体最优解可以通过一系列局部最优的选择得到。这种选择依赖于已做出的选择&#xff0c;不依赖于未做出的选择。贪心算法解决的问题&#xff0c;在程…...

Maven 基础

博文目录 文章目录 Maven基础概念生命周期 - Build Lifecycle阶段 - Build Phase目标 - Plugin goals默认目标绑定Clean 生命周期Default 生命周期Site 生命周期 插件 - Plugin POM&#xff08;Project Object Model&#xff09;Super POM项目继承 - Project Inheritance项目聚…...

算法刷题-哈希表-两数之和

两数之和 1. 两数之和思路总结其他语言版本 1. 两数之和 力扣题目链接 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中…...

kotlin学习(一)基本概念、数据对象类型、控制流程、空值检验、类与接口

文章目录 认识Kotlin跨平台特性语言类型java的语言类型kotlin的运行原理 hello world 基本概念程序入口数据与对象类型 和 显式数字转换浮点类型位运算AnyUnitNothing 声明变量只读变量 val与可变变量var查看Kotlin字节码 fun&#xff08;方法 / 函数&#xff09;函数参数默认值…...

包装器简介

可调用对象&#xff1a;可以使用&#xff08;&#xff09;运算符进行调用的对象&#xff0c;本质是能像函数一样使用的东西常见课调用对象&#xff1a;函数指针&#xff0c;仿函数&#xff0c;lambda表达式我们能否使用统一的方式对其封装&#xff0c;进行调用&#xff0c;这时…...

探索AI原生应用领域向量数据库的无限潜力

探索AI原生应用领域向量数据库的无限潜力关键词&#xff1a;向量数据库、AI原生应用、Embedding、向量相似度、多模态检索、大模型协同、语义理解摘要&#xff1a;当AI从“辅助工具”进化为“原生生产力”&#xff0c;一种专为AI设计的数据库——向量数据库&#xff0c;正在重塑…...

Transformer在车道线检测中的实战应用:LSTR模型从理论到代码实现

Transformer在车道线检测中的实战应用&#xff1a;LSTR模型从理论到代码实现 自动驾驶技术的快速发展对车道线检测提出了更高要求。传统基于CNN的分割方法往往需要复杂的后处理流程&#xff0c;而LSTR&#xff08;Lane Shape Prediction with Transformers&#xff09;通过端到…...

[特殊字符] 怕你停电的姐姐:UPS 还分 “直流” 和 “交流”? 今天一篇给你盘个透!

哈喽&#xff0c;我的老铁们&#xff01;我是你们那个 “怕你停电” 的姐姐&#xff0c;也是专门卖 UPS 电源的姐姐&#xff01;平时总有朋友问我&#xff1a;“姐姐&#xff0c;我看 UPS 有好多种&#xff0c;什么直流交流的&#xff0c;到底有啥区别&#xff1f;我该咋选&…...

告别C++复杂配置:5分钟在UE5里搞定一个简单的HTTP客户端

告别C复杂配置&#xff1a;5分钟在UE5里搞定一个简单的HTTP客户端 在独立游戏开发和教育领域&#xff0c;快速验证网络交互功能的需求日益增长。无论是从服务器拉取动态配置&#xff0c;还是提交玩家成绩数据&#xff0c;一个轻量级的HTTP客户端往往能大幅提升原型开发效率。传…...

League-Toolkit英雄联盟工具集启动故障解决方案

League-Toolkit英雄联盟工具集启动故障解决方案 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit作为一款基于LCU A…...

MMSegmentation项目交付必备:如何生成让客户/导师眼前一亮的可视化报告(附完整脚本)

MMSegmentation项目交付必备&#xff1a;如何生成让客户/导师眼前一亮的可视化报告&#xff08;附完整脚本&#xff09; 在计算机视觉项目的最终交付环节&#xff0c;一份专业、直观的可视化报告往往比堆砌技术参数更能打动客户或导师。MMSegmentation作为开源图像分割领域的标…...

# 发散创新:基于群体智能的Python蚁群算法优化路径规划实战在人工智能快速演进的时代,**群体智能(Swarm Int

发散创新&#xff1a;基于群体智能的Python蚁群算法优化路径规划实战 在人工智能快速演进的时代&#xff0c;群体智能&#xff08;Swarm Intelligence&#xff09; 作为一类受自然界生物行为启发的计算范式&#xff0c;正逐渐成为解决复杂优化问题的重要工具。本文聚焦于蚁群算…...

道心网络安全学习笔记系列之好靶场的信息收集2

上节课找了一个图片的网址&#xff0c;继续挑战其它靶场&#xff0c;我们看下一题收集十个百度域名&#xff0c;这还不是顺手就来&#xff0c;但是贴吧不行&#xff0c;那还不简单&#xff0c;去访问百度网站&#xff0c;顺便输入一个搜索词&#xff0c;都不用看&#xff0c;前…...

GNSS数据处理效率翻倍:FileZilla+crx2rnx自动化脚本一键下载转换RINEX观测值

GNSS数据处理效率革命&#xff1a;构建全自动RINEX观测值处理流水线 凌晨三点的实验室里&#xff0c;李工程师盯着屏幕上堆积如山的.crx文件叹了口气——这已经是本周第三次通宵处理GNSS观测数据了。对于需要处理多站点、长时间序列GNSS数据的科研人员和工程师而言&#xff0c;…...