重学Go语言之运算符与控制结构详解

目录
  • 运算符
    • 算术运算符
    • 关系运算符
    • 逻辑运算符
    • 位运算符
    • 赋值运算符
    • 指针运算符
  • 运算符的优先级
  • 控制结构
    • If
    • For
    • Switch
  • 小结

运算符

运算符的作用是将操作数组合成表达式,比如下面的代码中,我们通过赋值和加号组成了两个表达式:

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-switchswitch语句的另一种用法,主要用于类型断言,后续在学习接口(interface)再介绍

小结

总结一下,这篇文章主要讲了三点:

1.Go支持的运算符:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 赋值运算符
  • 位运算符
  • 指针运算符

2.运算符的优化级

3.Go支持的控制结构:

  • If语句
  • For语句
  • Switch语句

到此这篇关于重学Go语言之运算符与控制结构详解的文章就介绍到这了,更多相关Go语言 运算符 控制结构内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Golang 运算符及位运算详解

    什么是运算符? 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是"+". 在vb2005中运算符大致可以分为5种类型:算术运算符.位运算符. 关系运算符.赋值运算符.逻辑运算符. 算数运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 求余 注意: ++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符. func main() { a, b := 3,4 fmt.Printf("a 加 b

  • Go语言基础知识总结(语法、变量、数值类型、表达式、控制结构等)

    一.语法结构 golang源码采用UTF-8编码.空格包括:空白,tab,换行,回车. - 标识符由字母和数字组成(外加'_'),字母和数字都是Unicode编码. - 注释: 复制代码 代码如下: /* This is a comment; no nesting */ // So is this. 二.字面值(literals)类似C语言中的字面值,但数值不需要符号以及大小标志: 复制代码 代码如下: 23 0x0FF 1.234e7类似C中的字符串,但字符串是Unicode/UTF-8编码的

  • Go语言学习之运算符使用详解

    目录 1.算术运算符 2.关系运算符 3.逻辑运算符 4.位运算符 5.赋值运算符 6.特殊运算符 1.算术运算符 很常规,和java一样. 样例代码如下 // 算术运算符 func base() { a := 1 b := 20 c := 31 d := -1 fmt.Printf(" + -> %d\n", a+b) fmt.Printf(" - -> %d\n", b-a) fmt.Printf(" * -> %d\n",

  • 一文带你掌握Go语言运算符的使用

    目录 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 运算符优先级 运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 接下来让我们来详细看看各个运算符的介绍. 算术运算符 算术运算符,所有的数据类型要相同 下表列出了所有Go语言的算术运算符.假定 A 值为 10,B 值为 20. 运算符 描述 实例 + 相加 A + B 输出结果 30 - 相减 A - B 输出结果 -10 * 相

  • golang中为什么不存在三元运算符详解

    三元运算符广泛存在于其他语言中,比如: python: val = trueValue if expr else falseValue javascript: const val = expr ? trueValue : falseValue c.c++: const char *val = expr ? "trueValue" : "falseValue"; 然而,被广泛支持的三目运算符在golang中却是不存在的!如果我们写出类似下面的代码: val := ex

  • Go语言中的流程控制结构和函数详解

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和无条件跳转. if if也许是各种编程语言中最常见的了,它的语法概括起来就是:如果满足条件就做某事,否则做另一件事. Go里面if条件判断语句中不需要括号,如下代码所示: 复制代码 代码如下: if x > 10 {     fmt.Println("x is greater than 10&

  • Go语言运算符案例讲解

    算数运算符 算数运算符和C语言几乎一样 运算符 描述 实例 + 相加 A + B - 相减 A - B * 相乘 A * B / 相除 B / A % 求余 B % A ++ 自增 A++ – 自减 A– 注意点: 只有相同类型的数据才能进行运算 package main import "fmt" int main(){ var num1 int32 = 10 //var num2 int64 = num1 // 类型不同不能进行赋值运算 var num2 int64 = int64(

  • 手把手带你走进Go语言之运算符解析

    目录 概述 Go 运算符 算术运算符 关系运算符 逻辑运算符 赋值运算符 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. Go 运算符 运算符 (operator) 可以帮助我们在程序中执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算术运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 取余 ++ 自增 – 自减 例子: package main import "f

  • 重学Go语言之运算符与控制结构详解

    目录 运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 指针运算符 运算符的优先级 控制结构 If For Switch 小结 运算符 运算符的作用是将操作数组合成表达式,比如下面的代码中,我们通过赋值和加号组成了两个表达式: var i,j = 1,2 n := i + j Go的运算符大体分为六种:算术运算符.关系运算符.逻辑运算符.位运算符.赋值运算符和指针运算符. 算术运算符 运算符 含义 + 加号,除了用于整数,浮点数,复数外,还可以用于字符串的拼接 - 减号 * 相乘

  • 重学Go语言之数组的具体使用详解

    目录 什么是数组 数组的创建 访问数组的元素 数组的长度 如何遍历数组 数组的比较 查找数组中的元素 将数组作为函数参数 二维与多维数组 小结 什么是数组 什么是数组?数组是有固定长度的相同数据类型元素的集合, 如下图所示: 从数组的定义以及上面的示例图我们可以得到数组的三个特征: 固定长度,数组的长度在编译时就要确定. 每个元素的数据类型相同. 数组索引从0开始,索引的最大值为数组长度减1. 数组的创建 直接声明数组变量,在声明时必须指定长度: var iArray [2]int var sA

  • 重学Go语言之变量与常量的声明与使用详解

    目录 变量 变量名 声明 变量作用域 常量 iota 常量生成器 小结 变量 什么是变量?变量是一块可以随时存放数据的内存区域.在我们申请这块内存区域(声明变量)时,需要指定变量名以及变量的数据类型,数据类型用于说明变量可以存放什么值. Go是强类型语言,因此Go的变量需要先声明再使用,且声明后不可以改变其数据类型. 变量名 变量名必须以字母或下划线开头. 变量名区分大小写,比如Version和version是两个不同的变量. 不能用关键字(25个)和保留字(37个)给变量命名. 声明 Go语言

  • C语言运算符的重载详解

    目录 写一个Add函数 为什么不用加号作为函数名 运算符的重载 上面问题解决 总结 写一个Add函数 我们先讨论下面代码,并复习前面的内容 class Complex { private: double Real, Image; public: Complex() :Real(0), Image(0) {} Complex(double r, double i) :Real(r), Image(i) {} ~Complex() {} //Complex Add(const Complex* co

  • C语言程序环境和预处理详解分析

    目录 一.程序的翻译环境和运行环境 程序的翻译环境 链接阶段 执行环境(运行环境) 二.预处理详解 预定义符号 #define定义标识符 #define定义宏 #define 替换规则 #和##两个预处理的工具 带副作用的宏参数 宏和函数对比 #undef移除宏 命令行定义 条件编译 头文件包含 嵌套文件包含 总结 一.程序的翻译环境和运行环境 重点:任何ANSI C(标准C的程序)的一种实现,存在两个不同的环境 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令. 第2种是执行环境,

  • C/C++语言宏定义使用实例详解

     C/C++语言宏定义使用实例详解 1. #ifndef 防止头文件重定义 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成 一个可执行文件时,就会出现大量"重定义"的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定义. 方法:例如要编写头文件test.h 在头文件开头写上两行: #ifndef TEST_H #define TEST_H //一般是文件名的大写 头文件结尾写上一行: #endif 这样一个工程文件里同时

  • 从go语言中找&和*区别详解

    *和&的区别 :& 是取地址符号 , 即取得某个变量的地址 , 如 ; &a*是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值 . 从代码中验证 : 先构建一个Rect类型 : 1. &是取地址符号, 取到Rect类型对象的地址 2. *可以表示一个变量是指针类型(r是一个指针变量): 3.*也可以表示指针类型变量所指向的存储单元 ,也就是这个地址所指向的值 4.查看这个指针变量的地址 , 基本数据类型直

  • C语言入门之基础知识详解

    一.思维导图 内容不限于此思维导图 二.环境搭建 对于老手,自动跳过这一趴吧,或者也可以看一下我有没有啥纰漏,毕竟小白需要这一趴. 编译器很多,大部分老师会在学生学习C语言的时候推荐使用VC,不带语言提示器的那种,说是可以提高学生的编码能力.我也不知道到底是不是这么一回事儿.我推荐使用VS,这样学的快,函数记不住的问题很严重吗?项目的车轮碾压过去,再记不住也得记住吧!!! 更何况这个系列到后面是会有需要用文本文件编程写项目的阶段. 下载VS2019社区版,不要标新立异选那些最新版的,出了问题到时

  • C语言之system函数案例详解

    来看看在windows操作系统下system () 函数详解(主要是在C语言中的应用) 注意:在windows下的system函数中命令可以不区别大小写! 函数名: system 功 能: 发出一个DOS命令 用 法: int system(char *command); system函数已经被收录在标准c库中,可以直接调用. 例如: #include<stdio.h> #include<stdlib.h> int main() { printf("About to sp

  • C语言MultiByteToWideChar和WideCharToMultiByte案例详解

    目录 注意: 一.函数简单介绍 ( 1 ) MultiByteToWideChar() ( 2 ) WideCharToMultiByte() 二.使用方法 ( 1 ) 将多字节字符串转为宽字符串: ( 2 ) 从宽字节转为窄字节字符串 三.MultiByteToWideChar()函数乱码的问题 注意: 这两个函数是由Windows提供的转换函数,不具有通用性 C语言提供的转换函数为mbstowcs()/wcstombs() 一.函数简单介绍 涉及到的头文件: 函数所在头文件:windows.

随机推荐