Golang语言常用的操作符优先级及获取用户终端输入的两种方式

简介: 这篇文章介绍了Golang语言中常用的算术、赋值、关系、逻辑、位运算符以及指针运算符的使用,运算符优先级,以及如何通过Scanln和Scanf函数获取用户终端输入的两种方式。

                                              作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.运算符概述

运算符用于在程序运行时执行数学或逻辑运算。

Go语言内置的运算符有:算术运算符,赋值运算符,关系运算符,逻辑运算符,位运算符,指针运算符等。

二.算数运算符

1.常见的算数运算符

运算符 描述
+ 相加
- 相减
* 相乘
/ 相除
% 求余
++ 自增+1
-- 自减-1
温馨提示:
        1.在go语言中,++和--操作非常简单,只能单独使用,不能参与运算中去;
        2.在go语言中,++和--只能在变量的后面,不能写在变量的前面;

2.参考案例

package main

import (
    "fmt"
)

func main() {
    /*
        加法运算应用场景:
            - 正数
            - 相加操作
            - 字符串拼接

        减法运算应用场景:
            计算2个数字的差值。
    */
    var (
        // 加法表示正数
        a int = +10
        // 加法可以用于相加操作
        b int = 10 + 5
        // 加法可以用于字符串拼接
        c string = "hello" + "world"
        // 减法计算两个数据的差值
        x = 10 - 5
    )
    fmt.Printf("a = [%d], b = [%d], c = [%s], x = [%d]\n", a, b, c, x)

    /*
        乘号应用场景:
            多用于数值型的乘法计算。
        除号应用场景:
            多用于数值型的除法计算。
    */
    var (
        // 两个int类型数据运算,结果一定为整数类型
        d int = 10 / 3
        // 浮点类型参与运算,结果为浮点类型
        f float64 = 10.0 / 3
        y float64 = 10 * 2.5
    )
    fmt.Printf("d = [%d],f = [%.10f], y = [%.1f]\n", d, f, y)

    /*
        取模应用场景:
            多用于计算余数。
    */
    var (
        g int     = 10 % 3
        h float64 = -10 % -4
    )
    fmt.Printf("g = [%d],h = [%.2f]\n", g, h)

    /*
        ++:
            自增操作。
        --:
            自减操作。

        温馨提示:
            1.在go语言中,++和--操作非常简单,只能单独使用,不能参与运算中去;
            2.在go语言中,++和--只能在变量的后面,不能写在变量的前面;
    */
    var (
        i int = 10
        j     = 20
    )
    i++
    j--
    // 下面2种写法不被允许,编译会报错
    // ++i
    // --j
    fmt.Printf("i = [%d], j = [%d]\n", i, j)

}

三.赋值运算符

1.常见的赋值运算符

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

2.参考案例

package main

import "fmt"

func main() {
    var (
        a int = 10
        // 右侧的值运算清楚后,再复制给=的左侧
        b int = (10+20)%3 + 3 - 8
        c int = 10
        x     = 22
        y     = 33
    )

    // 等价于 c = c + 20
    c += 20

    fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)

    fmt.Printf("交换前: x = %d, y = %d\n", x, y)
    // 交换x和y的值
    x, y = y, x
    fmt.Printf("交换后: x = %d, y = %d\n", x, y)
}

四.关系运算符

1.常见的关系运算符

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

2.参考案例

package main

import (
    "fmt"
)

func main() {
    x := 10
    y := 5

    fmt.Println(x == y)
    fmt.Println(x != y)
    fmt.Println(x > y)
    fmt.Println(x >= y)
    fmt.Println(x < y)
    fmt.Println(x <= y)
}

五.逻辑运算符

1.常见的逻辑运算符

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

2.参考案例

package main

import (
    "fmt"
)

func main() {
    x := true
    y := false

    /*
    与逻辑: (也称为"短路与")
        两个条件都成才为真,只要有一侧是false,结果一定为false。
        所谓的"短路与",只要第一个数值/表达式结果是false,那么后面的表达式就不用运算了,直接结果就是false。
    */
    fmt.Println(y && x)

    /*
    或逻辑: (也称为"短路或")
        两个条件有任意一个成立就为真,只要有一侧是true,结果一定为true。
        所谓的"短路或",只要第一个数值/表达式结果是true,那么后面的表达式就不用运算了,直接结果就是true。
    */
    fmt.Println(x || y)

    /*
    非逻辑:
        取反操作,即原来为真取非就为假,原来为假取非后就为真。
    */
    fmt.Println(!x)
    fmt.Println(!y)

}

六.位运算符

1.常见的位运算符

运算符 描述
& 参与位与运算的两个数对应的二进制位都为1时才为真
| 参与位或运算的两个数对应的二进制位有任意一个为1则为真
^ 参与位异或运算(^)的两个数对应的二进制位不一样则为真
<< 左移n位就是乘以2的n次方。 "a<<b"是把a的各二进位全部左移b位,高位丢弃,低位补0。
>> 右移n位就是除以2的n次方。 "a>>b"是把a的各二进位全部右移b位,低位丢弃,高位补0。
温馨提示:
    位运算符对整数在内存中的二进制位进行操作。

2.参考案例

package main

import (
    "fmt"
)

func main() {

    x := 11
    y := 7
    fmt.Printf("%d ---> : %b\n", x, x)
    fmt.Printf("%.2d ---> : %.4b\n", y, y)

    // 参与位与运算(&)的两个数对应的二进制位都为1时才为真
    fmt.Printf("%d & %d ---> %d\n", x, y, x&y)

    // 参与位或运算(|)的两个数对应的二进制位有任意一个为1则为真
    fmt.Printf("%d | %d ---> %d\n", x, y, x|y)

    // 参与位异或运算(^)的两个数对应的二进制位不一样则为真
    fmt.Printf("%d ^ %d ---> %d\n", x, y, x^y)

    // 左移n位就是乘以2的n次方。 "a<<b"是把a的各二进位全部左移b位,高位丢弃,低位补0。
    fmt.Printf("%d  << 2  ---> %d\n", y, y<<2)

    // 右移n位就是除以2的n次方。 "a>>b"是把a的各二进位全部右移b位,低位丢弃,高位补0。
    fmt.Printf("%d >> 2 ---> %d\n", x, x>>2)

}

七.指针运算符

1.其他运算符概述

其他运算符我们在指针的章节有介绍过,分别为"&"和"*"。
  &:
    返回变量的存储地址。

  *:
    取指针变量对应的数据。

参考链接:
    https://www.cnblogs.com/yinzhengjie/p/18286812

2.参考案例

package main

import "fmt"

func main() {
    var (
        // 定义一个int基础数据类型
        a int = 100

        // 定义一个*int指针类型数据
        b *int = &a
    )
    fmt.Printf("a对应内存地址为: %v,存储的数据为:%v\n", &a, a)
    fmt.Printf("b对应的内存地址为: %v,存储的数据为: %v,指针指向的数据为: %v\n", &b, b, *b)

}

八.运算符的优先级

1.运算符优先级一览表

优先级 分类 运算符 顺序
1 逗号运算符 , 从左到右
2 赋值运算符 \= 、 +=、 -=、 *= 、 /= 、%=、 >=、 <<=、 &=、 ^= 、 从右到左
3 逻辑或 || 从左到右
4 逻辑与 && 从左到右
5 按位或 | 从左到右
6 按位异或 ^ 从左到右
7 按位与 & 从左到右
8 相等/不等 \==、!= 从左到右
9 关系运算符 <、<=、>、>= 从左到右
10 位移运算符 <<、>> 从左到右
11 加法/减法 +、- 从左到右
12 乘法/除法/取余 *(乘号)、/、% 从左到右
13 单目运算符 !、*(指针的值)、&(指针的地址)、++、--、+(正号)、-(负号) 从右到左
14 后缀运算符 ()、[]、->、 从左到右
如上表所示,Go语言有几十种运算符,被分成十几个级别,有的运算符优先级不同,有的运算符优先级相同。

但是记住上面的运算符优先级太费劲了,我们可以记住一句话,为了提高优先级,可以加小括号"()"即可。

2.运算符优先级案例

package main

import "fmt"

func main() {

    var (
        x int = 100
        y     = 20
        z     = 50
    )

    // 1.很明显,运算符先算的是乘法,再算加法。
    result01 := x + y*z

    // 2.通过小括号"()"让加法运算先执行,再去执行乘法。
    result02 := (x + y) * z

    fmt.Printf("result01 = %d\n", result01)
    fmt.Printf("result02 = %d\n", result02)
}

九.获取用户输入的两种方式

package main

import "fmt"

func main() {
    /*
         需求分析:
             键盘录入用户的姓名,年龄,分数是否是svip。

         实现方式:
             方式一: Scanln(推荐)
                按行录入,输入数据的时候,类型一定要匹配,因为底层会自动判断类型的。如果未输入,则使用数据的默认值("零值")

            方式二: Scanf
                从标准输入扫描文本,根据参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。
    */

    // 方式一: 基于Scanln实现
    var name string
    fmt.Println("请输入用户的姓名: ")
    fmt.Scanln(&name)

    var age int
    fmt.Println("请输入用户的年龄: ")
    fmt.Scanln(&age)

    var score float64
    fmt.Println("请输入用户的积分: ")
    fmt.Scanln(&score)

    var svip bool
    fmt.Println("请输入用户是否为SVIP: ")
    fmt.Scanln(&svip)

    fmt.Printf("用户的姓名为: [%v],年龄: [%v], 积分: [%v], SVIP: [%v]\n", name, age, score, svip)

    // 方式二: 基于Scanf实现
    // fmt.Println("请输入用户的姓名,年龄,积分,vip;使用空格分隔即可")
    // var (
    //     name  string
    //     age   uint8
    //     score float64
    //     svip  bool
    // )
    // fmt.Scanf("%s %d %f %t", &name, &age, &score, &svip)
    // fmt.Printf("用户的姓名为: [%v],年龄: [%v], 积分: [%v], SVIP: [%v]\n", name, age, score, svip)

}
目录
相关文章
|
14天前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
47 4
Golang语言之管道channel快速入门篇
|
14天前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
37 4
Golang语言文件操作快速入门篇
|
14天前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
42 3
Golang语言之gRPC程序设计示例
|
14天前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
37 4
|
14天前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
36 3
|
14天前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
23 4
Golang语言goroutine协程篇
|
14天前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
20 3
Golang语言之Prometheus的日志模块使用案例
|
14天前
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
16 3
Golang语言之函数(func)进阶篇
|
14天前
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
17 2
Golang语言之函数(func)基础篇
|
14天前
|
Go
Golang语言之映射(map)快速入门篇
这篇文章是关于Go语言中映射(map)的快速入门教程,涵盖了map的定义、创建方式、基本操作如增删改查、遍历、嵌套map的使用以及相关练习题。
21 5