Go的表达式解析:理解代码的核心

目录

表达式的类型

表达式的运算符

表达式的优先级

表达式的求值顺序

占位符表达式

1. 下划线用在import导包上

2. 下划线用在代码表达式上

实战案例:表达式的注意事项和计算圆的面积和周长

总结


图片

更多关于Go的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

 原文:Go的表达式解析:理解代码的核心

本篇文章我将为大家总结介绍下Go语言中关于表达式的知识点。

图片

当我们使用Go语言编写程序时,经常会使用表达式来进行各种计算和逻辑操作。表达式是Go语言中的重要组成部分,表达式是由运算符和操作数组成的,它们用于计算和操作数据。在Go语言中,表达式可以是简单的常量、变量、运算符,也可以是复杂的函数调用、类型转换等。

本文我将详细介绍Go语言中的表达式,包括表达式的类型、运算符、优先级、求值顺序等方面。最后提供了一个表达式的实战案例,用来演示计算圆的面积和周长。

表达式的类型

在Go语言中,表达式的类型可以分为基本类型和复合类型两种。

基本类型包括整型、浮点型、布尔型、字符串等,它们是Go语言中最基本的数据类型,可以用于存储和操作数据。

复合类型包括数组、切片、结构体、函数等,它们是由基本类型组合而成的复杂数据类型,可以用于表示更复杂的数据结构和算法。

表达式的运算符

在Go语言中,表达式的运算符可以分为算术运算符、比较运算符、逻辑运算符、位运算符等多种类型。

算术运算符包括加、减、乘、除、取模等,用于对数值进行基本的算术运算。

比较运算符包括等于、不等于、大于、小于等,用于比较两个数值或字符串的大小关系。

逻辑运算符包括与、或、非等,用于对布尔值进行逻辑运算。

位运算符包括按位与、按位或、按位异或等,用于对二进制数值进行位运算。

关于运算符的内容可以参考公众号CTO Plus前面的文章《Go的运算符解密:探索计算的奥秘》

表达式的优先级

在Go语言中,表达式的优先级指的是运算符的优先级,不同运算符的优先级不同,会影响表达式的求值顺序。

在表达式中,括号具有最高的优先级,其次是乘除法运算符,再次是加减法运算符,最后是比较运算符和逻辑运算符。

需要注意的是,如果表达式中包含多个运算符,需要使用括号来明确运算顺序,否则可能会导致表达式求值结果错误。

表达式的求值顺序

在Go语言中,表达式的求值顺序是从左到右的,也就是说,先计算左边的表达式,再计算右边的表达式。

需要注意的是,在表达式中可能存在多个运算符,而不同运算符的优先级不同,因此需要使用括号来明确运算顺序。

同时,如果表达式中包含函数调用,函数的参数求值顺序也是从左到右的。

占位符表达式

占位符表达式就是下划线“_”, _是特殊标识符,用来忽略结果。

1. 下划线用在import导包上

 

在Golang里,import的作用是导入其他package。

import 下划线(如:import _ "practice_32_pkg/hellosteverocket")的作用:当导入一个包时,该包下的文件里所有init()函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。这个时候就可以使用 import 引用该包。即使用【import _ 包路径】只是引用该包,仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数。

如下示例:

代码结构

图片

                     

使用下滑线导包的代码示例:Operator_.go

package main
import _ "practice_32_pkg/hellosteverocket"
func main() {  //hellosteverocket.ShowFunc()  // undefined: hellosteverocket}

不使用下滑线导包的代码示例:OperatorPkg.go

package main
import "practice_32_pkg/hellosteverocket"
func main() {  hellosteverocket.ShowFunc()  hellosteverocket.ShowFunc2()}/* outputsthis is init function for init_functhis is init function for steverocketthis is show onethis is show two*/

同样,下划线用在导第三方包上

import "database/sql"

import _ "github.com/go-sql-driver/mysql"

第二个import就是不直接使用mysql包,只是执行一下这个包的init函数,把mysql的驱动注册到sql包里,然后程序里就可以使用sql包来访问mysql数据库了。

2. 下划线用在代码表达式上

下面是一个将下划线使用在代码表达式上面的代码示例

package main
import "os"
func main() {  buf := make([]byte, 1024)  // 下划线意思是忽略这个变量  //f, err := os.Open("operator.go")  //如果此时不需要知道返回的错误值, 则可以忽略掉err  f, _ := os.Open("operator.go") // os.Open,返回值为*os.File,error  defer f.Close()  for {    // 这种情况的下划线是起到一个占位的作用,方法返回两个结果,而只想要一个结果。    n, _ := f.Read(buf)    if n == 0 {      break    }    os.Stdout.Write(buf[:n])  }}

下划线也起到一个占位符的作用(与Python等同),意思是那个位置本应赋给某个值,但是我不需要这个值。所以就把该值赋给下划线,意思是丢掉不要。这样编译器可以更好的优化,任何类型的单个值都可以赋值给下划线。

实战案例:表达式的注意事项和计算圆的面积和周长

下面分别使用3个案例演示下表式在计算过程中的一些问题

案例1:避免整数除法的精度丢失

在Go语言中,整数除法会丢失小数部分,只保留整数部分。如果需要保留小数部分,可以将其中一个操作数转换为浮点数。例如:

func express01() {  a := 10  b := 3  fmt.Println(a / b) // 3  //fmt.Println(float64(a) / b) // invalid operation: float64(a) / b (mismatched types float64 and int)  fmt.Println(float64(a) / float64(b)) // 3.3333333333333335}

案例2:注意浮点数的精度问题

浮点数在计算机中是以二进制表示的,因此在进行浮点数运算时可能会出现精度问题。例如:

func express02() {  a := 0.1  b := 0.2  fmt.Println(a + b) // 结果并不是0.3,而是一个接近0.3的近似值   0.30000000000000004  //为了避免精度问题,可以使用math/big包中的Float类型进行高精度计算。
  //注意类型转换的安全性  //在Go语言中,类型转换是一种将一个类型的值转换为另一个类型的操作。但是,需要注意类型转换的安全性,避免在类型转换时丢失精度或导致溢出。例如:  num1 := 10000000000  res1 := int32(num1) // 此时的结果是不确定的,因为a的值超出了int32类型的范围  res2 := int64(num1)  fmt.Println(res1, res2) // 1410065408 10000000000  //为了避免类型转换的安全问题,可以使用类型断言来判断类型是否可转换。}

实际开发中,对于超出 int64 或者uint64 类型的大数进行计算时,如果对精度没有要求,使用 float32 或者 float64 就可以胜任,但如果对精度有严格要求的时候,我们就不能使用浮点数了,因为浮点数在内存中只能被近似的表示。Go语言中 math/big 包实现了大数字的多精度计算,支持 Int(有符号整数)、Rat(有理数)和 Float(浮点数)等数字类型。这些类型可以实现任意位数的数字,只要内存足够大,但缺点是需要更大的内存和处理开销,这使得它们使用起来要比内置的数字类型慢很多。

案例3:注意指针的使用

在Go语言中,指针用于存储变量的内存地址。使用指针可以直接操作变量的值,而不需要进行值的拷贝。但是,需要注意指针的生命周期,避免在指针指向的变量被释放后继续使用指针。例如:

func getPointer() *int {  value := 10  return &value}
pointer := getPointer()result := *pointerfmt.Println(result)

接下来,我分享一个表达式的实战案例,这个案例展示了如何使用表达式来解决实际问题。

假设我们需要编写一个程序,根据给定的半径计算圆的面积和周长。我们可以使用以下公式来计算:

面积 = π * 半径 * 半径

周长 = 2 * π * 半径

首先,我们需要定义一个变量来存储半径的值。我们可以使用var关键字来声明一个变量,并使用赋值运算符(=)来给变量赋初值。

var radius float64 = 5.0

接下来,我们可以使用表达式来计算圆的面积和周长。我们可以使用常量math.Pi来表示圆周率π,并使用乘法运算符(*)和加法运算符(+)进行计算。

var area float64 = math.Pi * radius * radius

var circumference float64 = 2 * math.Pi * radius

最后,我们可以使用fmt.Printf函数来打印结果。

fmt.Printf("半径为 %.2f 的圆的面积为 %.2f,周长为 %.2f\n", radius, area, circumference)

完整的程序代码如下:

图片

这个实战案例展示了如何使用表达式来计算圆的面积和周长。通过使用变量、常量和运算符,我们可以轻松地进行各种数学和逻辑操作。这只是表达式的一个简单示例,实际上,表达式在程序中的应用非常广泛,我们可以根据具体的需求使用不同的运算符和操作数来构建更复杂的表达式。

总结

本文介绍了Go语言中的表达式,包括表达式的类型、运算符、优先级、求值顺序等方面。在使用表达式时,需要注意表达式的类型和运算符,以及表达式的优先级和求值顺序等问题。

云原生&微服务专栏
https://blog.csdn.net/zhouruifu2015/category_5704941

更多精彩,关注我公号,一起学习、成长

图片

推荐阅读:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值