《Go语言原来这么简单》 -- 运算符与流程控制

158 阅读3分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

逻辑运算符

Go语言的逻辑运算符与其他语言并没有什么差别

算术运算符

运算符描述
+相加
-相减
*相乘
/相除
%求余

注意:  ++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。 所以说 i++ 是可以的但是 他不能赋值给其他变量。也没有++i

关系运算符

运算符描述
==检查两个值是否相等,如果相等返回 True 否则返回 False。
!=检查两个值是否不相等,如果不相等返回 True 否则返回 False。
检查左边值是否大于右边值,如果是返回 True 否则返回 False。
>=检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。
<检查左边值是否小于右边值,如果是返回 True 否则返回 False。
<=检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。

逻辑运算符

运算符描述
&&逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False。
逻辑 OR 运算符。 如果两边的操作数有一个 True,则为 True,否则为 False。
!逻辑 NOT 运算符。 如果条件为 True,则为 False,否则为 True。

位运算符

位运算符对整数在内存中的二进制位进行操作。

运算符描述
&参与运算的两数各对应的二进位相与。 (两位均为1才为1)
参与运算的两数各对应的二进位相或。 (两位有一个为1就为1)
参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (两位不一样则为1)
<<左移n位就是乘以2的n次方。 “a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。
>>右移n位就是除以2的n次方。 “a>>b”是把a的各二进位全部右移b位。

赋值运算符

运算符描述
=简单的赋值运算符,将一个表达式的值赋给一个左值
+=相加后再赋值
-=相减后再赋值
*=相乘后再赋值
/=相除后再赋值
%=求余后再赋值
<<=左移后赋值
>>=右移后赋值
&=按位与后赋值
丨=按位或后赋值
^=按位异或后赋值

流程控制

if else 语句

在文本的读取以及条件判断会用到if else语句 基础用法

if 表达式1 {
    分支1
} else if 表达式2 {
    分支2
} else{
    分支3
}

注意:if 后表达式没有 括号

if条件语句也可写成if score := 75; score > 90 {...的格式,这时的score为if内部的局部变量

carbon (14).png

for循环语句

go 中没有 while 循环 可用for循环代替 for 循环基本格式

for 初始语句;结束条件;条件表达式(递增表达式){
    循环体语句
}

go语言中 初始语句,条件表达式,结束语句可以都不存在 1.初始语句,结束条件,条件表达式都存在

func add100() {
   var result int
   for n := 100; n > 0; n-- {
      result += n
   }
   fmt.Println(result)
}
  1. 只存在结束条件和条件表达式
func convertToBin(n int) string {
   result := ""
   for ; n > 0; n /= 2 {
      lsb := n % 2
      result = strconv.Itoa(lsb) + result
   }
   return result
}

3.只存在条件表达式

func forDemo3() {
	i := 0
	for i < 10 {
		fmt.Println(i)
		i++
	}
}

4.都不存在类似while语句

func forToWhile() {
   for {
      fmt.Println("do .....")
   }
}

for循环可以通过breakgotoreturnpanic语句强制退出循环。

for range 循环

Go语言中可以使用for range遍历数组、切片、字符串、map 及通道(channel)。 通过for range遍历的返回值有以下规律:

  1. 数组、切片、字符串返回索引和值。
  2. map返回键和值。
  3. 通道(channel)只返回通道内的值。

switch case

当语句中存在大量的判断,switch case 可以是一种更加优雅的写法 ,Go语言规定每个switch只能有一个default分支。而且case 会自动break

func switchDemo() {
	score := 70
	switch {
	case score <= 30:
		fmt.Println("D")
	case score > 30 && score < 60:
		fmt.Println("C")
	case score >= 90:
		fmt.Println("A")
	default:
		fmt.Println("B")
	}
}

fallthrough语法可以执行满足条件的case的下一个case,是为了兼容C语言中的case设计的。

goto

当for循环需要跳出的时候 我们可以使用 break 但是当多循环嵌套时,就显得臃肿。

func gotoDemo() {
   for i := 0; i < 10; i++ {
      for j := 0; j < 10; j++ {
         if j == 2 {
            // 设置退出标签
            goto breakTag
         }
         fmt.Printf("%v-%v\n", i, j)
      }
   }
// 标签
breakTag:
   fmt.Println("结束for循环") 
}

注意:标签应在循环下方,否则会重复执行循环

break + 标签跳出循环

break语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的forswitch和 select的代码块上。 举个例子:

func breakDemo() {
breakDemo:
   for i := 0; i < 10; i++ {
      for j := 0; j < 10; j++ {
         if j == 2 {
            break breakDemo
         }
         fmt.Printf("%v-%v\n", i, j)
      }
   }
   fmt.Println("...")
}

continue(继续下次循环)

continue语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for循环内使用。

在 continue语句后添加标签时,表示开始标签对应的循环。

总结

流程控制在实际应用中是最常使用的。在实际应用中合理的使用循环,以及goto等特殊语法可以很大的简化开发。