重学Go语言之运算符与控制结构详解
作者:程序员读书 发布时间:2024-02-07 23:42:06
运算符
运算符的作用是将操作数组合成表达式,比如下面的代码中,我们通过赋值和加号组成了两个表达式:
var i,j = 1,2
n := i + j
Go的运算符大体分为六种:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和指针运算符。
算术运算符
运算符 | 含义 |
---|---|
+ | 加号,除了用于整数,浮点数,复数外,还可以用于字符串的拼接 |
- | 减号 |
* | 相乘 |
/ | 相除 |
% | 求余,只能用于整数 |
++ | 自增 |
-- | 自减 |
+ | 正数,注意与加号(+)的区别 |
- | 负数,注意与减号(-)的区别 |
用法示例:
var str1 string = "hello"
var str2 string = "world"
str := str1 + str2 //使用+号拼接字符串
i := 3.2 % 2 //报错,只能对整数求余
var n int = 1
n++
++n //错误,自增只能加了操作数后面,自减也是同样的
关系运算符
通过逻辑运算符组成的表达式,其计算结果为布尔值,一般用于控制结构的条件部分:
运算符 | 含义 |
---|---|
== | 相等 |
!= | 不相等 |
<= | 小于或等于 |
< | 小于 |
>= | 大于或等于 |
用法示例:
if 2 == (1 + 1) {
fmt.Println("相等")
}
逻辑运算符
逻辑运算符组成的表达式,其计算结果也同样蝇布尔值,因此也用于控制结构的条件部分:
运算符 | 含义 |
---|---|
&& | 逻辑与 |
|| | 逻辑或 |
! | 逻辑非,一元运算符,具有较高的优先级 |
位运算符
位运算符只能用于整数
运算符 | 含义 |
---|---|
& | 按位与,两个操作数都1的位置为1,否为0 |
| | 按位或,两个操作数只要有1的位置,都为1,否则为0 |
按位异或,两个操作数都相同为0,否则为1 | |
<< | 按位左移 |
>> | 按位右移 |
&^ | 按位清空,根据右边操作数为1的位置,将左边对应位置设为0。 |
用法示例:
fmt.Println(2 & 1) // 00000010 & 00000001,可以看出,没有哪个位置两个操作都为1,因此结果为:00000000
fmt.Println(2 | 1) // 00000010 & 00000001,结果为00000011,也就是3
fmt.Println(2 ^ 1) // 00000010 & 00000001,结果为00000011,也就是3
fmt.Println(1 << 1) //00000001 => 00000010
fmt.Println(2 >> 1) //00000010 => 00000001
fmt.Println(23 &^ 5) 00010111 &^ 00000101 => 00010010
赋值运算符
运算符 | 含义 |
---|---|
= := | 赋值 |
+= | 先将左侧与右侧的操作数相加,再赋值给左边的变量 |
-= | 先将左侧与右侧的操作数相减,再赋值给左边的变量 |
*= | 先将左侧与右侧的操作数相乘,再赋值给左边的变量 |
/= | 先将左侧与右侧的操作数相除,再赋值给左边的变量 |
%= | 先将左侧与右侧的操作数求余,再赋值给左边的变量 |
<<= | 先将左侧的操作数按右侧的操作数向左位移,再将位移结果赋给左边的变量 |
>>= | 先将左侧的操作数按右侧的操作数向右位移,再将位移结果赋给左边的变量 |
&= | 先将左侧与右侧的操作数进行按位与计算,再将计算结果赋给左边的变量 |
!= | 先将左侧与右侧的操作数进行按位或计算,再将计算结果赋给左边的变量 |
^= | 先将左侧与右侧的操作数进行按异或计算,再将计算结果赋给左边的变量 |
指针运算符
运算符 | 含义 |
---|---|
& | 获取变量在内存中的地址 |
* | 声明指针变量 |
运算符的优先级
Go的++与--运算符作用于操作数时形成的是表达式,因此不纳入运算符的优先级中。
在Go语言中,一元运算符具有更高的优先级,如+(正数), -(负数),!(取反),*(指针声明), &(取址)。
而赋值运算符的优先级最低,除了一元运算符以及赋值运算符外,剩下的运算符可以划分为五个优先等级:
优先级 | 运算符 |
---|---|
5 | * / % << >> & &^ |
4 | + - | ^ |
3 | == != < <= >= > |
2 | && |
1 | || |
控制结构
Go的控制结构包括if
语句、for
语句和switch
语句三种。
If
if
语句用于判断某个条件是否满足,如果满足,则执行if语句中的代码块,如果不满足,则忽略if
语句中的代码块并继续向后执行。
最简单的if
语句结构为:
if boolean expression {
// do something
}
其中boolean expression
为一个可以得到布尔值的表达式,当布尔值为true
,会执行if
语句中的代码块,如:
if 2 < 10 {
fmt.Println("ok")
}
除了用于判断的boolean expression
外,if
也可以包含一个初始化表达式:
if initialization;boolean expression{
// do something
}
这种情况下,if
会先执行初始化表达式,之后再判断boolean expression
得到的布尔是否为true
:
if i = 10;i < 100 {
fmt.Println("ok")
}
if
语句后面也可以跟上else
语句,当然if
条件不满足时,会执行else
语句中的代码块:
if boolean expression{
// do something
}else{
// do something
}
用法示例:
if i = 11;i < 11{
fmt.Println("ok")
}else{
fmt.Println("bad")
}
如果有多个分支条件判断,可以在if
语句后面跟上多个else if 语句,最后可以跟上else
语句,当所有条件都不满足时,会执行else
语句中的代码块:
if boolean expression1 {
// do something
} else if boolean expression2 {
// do something else
} else if boolean expression3 {
// do something else
}else {
// catch-all or default
}
For
for
语句用于根据条件循环执行其中的代码块,最简单的for
语句格式如下:
for condition {
//do something
}
condition
为一个可得到布尔值的表达式,Go
语言中并没有while
或者do-while
语句,因此这种方式的用法接近其他编程语言的while
或者do-while
语句:
x := 1
for x < 20{
fmt.Println(x)
x++
}
如果condition
为空,那么此时for
则为死循环:
for {
//do something
}
for
最经典,在其他编程语言也有的用法是下面这种形式:
for init statement;condition;post statement{
//do something
}
用法示例:
for i := 0; i< 10 ;i++ {
fmt.Println(i)
}
另外,for
语句还与关键字range
配合,可以用于遍历数组、map
和切片等,其作用类似PHP
中的foreach
语句:
for k,v := range array {
//do something
}
用法示例:
var a [10]int = [10]int{1,2,3,4,5,6,7,8,9,10}
for index,value := range a {
fmt.Println(index,value)
}
使用break
关键字结束循环
for i := 0; i < 10; i++ {
if i == 5 {
break
}
fmt.Println(i)
}
使用continue
结束跳过单次循环:
for i := 0;i<10;i++{
if i == 5 {
continue
}
fmt.Println(i)
}
Switch
Switch
与if类似,用于根据条件执行满足条件的代码块,但其用法与if
不同,switch
有几种不同的用法:
第一种使用方法会将switch后面的值与case后面所跟的值进行比较,满足条件则执行case
中的代码块,如果都不满足,则执行default
中的代码块,其结构如下所示:
switch var1 {
case val1:
...
case val2:
...
default:
...
}
用法示例:
var x = 8
switch x {
case 8 :
fmt.Println("8")
case 9 :
fmt.Println("9")
case 10 :
fmt.Println("10")
default :
fmt.Println("not found")
}
从上面的例子可以看出,在满足某个条件后,switch执行完该分支就会退出switch语句,不需要像其他编程语言一样使用break
来退出switch
语句。
如果不想退出switch语句,需要继续让switch语句往下执行,可以在case
语句内使用fallthrough
关键词:
var x = 8
switch x {
case 8 :
fmt.Println("8")
fallthrough
case 9 :
fmt.Println("9")
fallthrough
case 10 :
fmt.Println("10")
default :
fmt.Println("not found")
}
上面语句在匹配到case 8:
之后,碰到了fallthrough
语句,所以继续往下执行,接着继续碰到fallthrough
语句,再继续执行,因此三个case代码块都会被执行。
switch
的另一种用法是将后面的变量省略,而把执行的判断条件放在case
关键词后面,这个用法与if/elseif
语句类似:
switch {
case condition1:
...
case condition2:
...
default:
...
}
用法示例:
x := 10
switch {
case x >= 10:
fmt.Println("10")
case x > 11:
fmt.Println("11")
default:
fmt.Println("not found")
}
switch
后面可以跟上一个初始化语句:
switch initialization {
case condition1:
...
case condition2:
...
default:
...
}
用法示例:
switch x := 10; {
case x >= 10:
fmt.Println("10")
case x > 11:
fmt.Println("11")
default:
fmt.Println("not found")
}
type-switch
是switch
语句的另一种用法,主要用于类型断言,后续在学习接口(interface
)再介绍
小结
总结一下,这篇文章主要讲了三点:
1.Go支持的运算符:
算术运算符
关系运算符
逻辑运算符
赋值运算符
位运算符
指针运算符
2.运算符的优化级
3.Go支持的控制结构:
If语句
For语句
Switch语句
来源:https://juejin.cn/post/7204683121374756923


猜你喜欢
- 前言本实验中所用数据库创建SQL语句以及插入数据到数据库中的SQL语句链接:链接: https://pan.baidu.com/s/1BnF
- 本文使用c语言来对sql server数据库进行操作,实现通过程序来对数据库进行增删改查操作。操作系统:windows 10
- 前言最近我在公司优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有所帮助。我们使用的数据库是Mysql8,
- 我就废话不多说了,大家还是直接看代码吧~package mainimport ("fmt""os/exec&q
- 利用python查找电脑里的文件非常方便比如在我的电脑:D:\软件 文件夹里有非常非常多的软件。我忘记某个软件叫什么名字了,只记得文件名称里
- 本文实例为大家分享了vue iview动态新增和删除的具体代码,供大家参考,具体内容如下<Form ref="capsule
- 本文实例介绍了使用javascript来经验表单数据的方法,如:校验是否为英文,校验是否为数字及校验IP地址等: &l
- 图的实现所谓图就是节点及其连接关系的集合。所以可以通过一个一维数组表示节点,外加一个二维数组表示节点之间的关系。//图的矩阵实现typede
- interface {} 可以用于模拟多态xdm 咱们写一个简单的例子,就举动物的例子写一个 Animal 的接口,类似于 jav
- 语法: text-overflow : clip | ellipsis 参数: clip : 不显示省略标记(...),而是简单的裁切 el
- 记录一些pandas选择数据的内容,此前首先说行列名的获取和更改,以方便获取数据。此文作为学习巩固。这篇博的内容顺序大概就是: 行列名的获取
- 在附加数据库后查看不了数据库关系图,也无法建立数据库关系图 我的解决方法如下: 1、设置兼容级别为90(2005为90)(2000为80)
- 大家做网站,特别是自己写的代码,常常担心被一些黑客入侵服务器,从而导致网站代码被盗,给自己带来一些损失。那么我们怎么样做,就算黑客盗了你的代
- 这篇文章主要介绍了使用python脚本自动创建pip.ini配置文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进
- 1. Anaconda1.1 Anaconda简介Anaconda是一个开源的python发行版本,是现在比较流行的python数据科学平台
- 加载静态文件在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件, js 执行文件以及一些图片等。因此在 DTL 中加载静
- [Hack] 意为”劈”、”砍”。 [Hacker] 意为”黑客”CSS Hack 是指针对不同的浏览器写不同的CSS code的过程,简单
- 递归查询对于同一个表父子关系的计算提供了很大的方便,这个示例使用了SQL server 2005中的递归查询,使用的表是CarParts,这
- docutils 的官方工具地址为:https://docutils.sourceforge.io/目前的更新主要是在版本和使用手册的更新上