前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go语言慢速入门——go运算符

go语言慢速入门——go运算符

作者头像
zy010101
发布2022-07-27 14:32:25
2800
发布2022-07-27 14:32:25
举报
文章被收录于专栏:程序员

go运算符

go的大多数运算符在大多数其它编程语言中都有。需要关注的二元运算符涉及到的两个操作数必须一样。

  • 如果这两个操作数都是类型确定值,则它们的类型必须相同,或者其中一个操作数可以被隐式转换到另一个操作数的类型。
  • 如果其中只有一个操作数是类型确定的,则要么另外一个类型不确定操作数可以表示为此类型确定操作数的类型的值,要么此类型不确定操作数的默认类型的任何值可以被隐式转换到此类型确定操作数的类型。
  • 如果这两个操作数都是类型不确定的,则它们必须同时都为两个布尔值,同时都为两个字符串值,或者同时都为两个基本数字值。 go对位运算的支持比较强大,它支持了清位操作(&^),但是go目前的生态并没有发展嵌入式,IOT方向,因此位运算不常用。

溢出

  • 一个类型确定数字型常量所表示的值是不能溢出它的类型的表示范围的。
  • 一个类型不确定数字型常量所表示的值是可以溢出它的默认类型的表示范围的。 当一个类型不确定数字常量值溢出它的默认类型的表示范围时,此数值不会被截断(亦即回绕)。
  • 将一个非常量数字值转换为其它数字类型时,此非常量数字值可以溢出转化结果的类型。 在此转换中,当溢出发生时,转化结果为此非常量数字值的截断(亦即回绕)表示。

下面是一些例子:

代码语言:javascript
复制
package main

import "fmt"

func main() {
	var a, b uint8 = 255, 1
	var c = a + b           // a和b都是uint8,go编译器推断c也是uint8类型
	fmt.Println(c)
	var d = a << b          // a和b都是uint8,go编译器推断d也是uint8类型
	fmt.Println(d, uint16(a)<<b)    // 强制转换a为uint15,那么整体的运算结果的数据类型是uint16
    var x = 1.2 + 3/2
}

++和–表达式

在python中,支持取消了令人感到不舒服的C/C++中的++和–运算符;而在go语言中,它们不在是运算符,而是表达式,并且只有后置的形式。因此下面这样的代码是错误的。

代码语言:javascript
复制
var a = 0
var b = a++     // 错误,++是表达式,它没有值。我们只能将它放在单独的一行。
a++             // 正确,++是表达式。

记住,–和++是表达式,不是运算符,并且只能出现后置。++是自增,–是自减

关于算术运算的结果

除了移位运算,对于一个二元算术运算,

  • 如果它的两个操作数都为类型确定值,则此运算的结果也是一个和这两个操作数类型相同的类型确定值。
  • 如果只有一个操作数是类型确定的,则此运算的结果也是一个和此类型确定操作数类型相同的类型确定值。 另一个类型不确定操作数的类型将被推断为(或隐式转换为)此类型确定操作数的类型。
  • 如果它的两个操作数均为类型不确定值,则此运算的结果也是一个类型不确定值。 在运算中,两个操作数的类型将被设想为它们的默认类型中一个(按照此优先级来选择:complex128高于float64高于rune高于int)。 结果的默认类型同样为此设想类型。 比如,如果一个类型不确定操作数的默认类型为int,另一个类型不确定操作数的默认类型为rune, 则前者的类型在运算中也被视为rune,运算结果为一个默认类型为rune的类型不确定值。 对于移位运算,结果规则有点小复杂。首先移位运算的结果肯定都是整数。
  • 如果左操作数是一个类型确定值(则它的类型必定为整数),则此移位运算的结果也是一个和左操作数类型相同的类型确定值。
  • 如果左操作数是一个类型不确定值并且右操作数是一个常量,则左操作数将总是被视为一个整数。 如果它的默认类型不是一个整数(rune或int),则它的默认类型将被视为int。 此移位运算的结果也是一个类型不确定值并且它的默认类型和左操作数的默认类型一致。
  • 如果左操作数是一个类型不确定值并且右操作数是一个非常量,则左操作数将被首先转化为运算结果的期待设想类型。 如果期待设想类型并没有被指定,则左操作数的默认类型将被视为它的期待设想类型。 如果此期待设想类型不是一个基本整数类型,则编译报错。 当然最终运算结果是一个类型为此期待设想类型的类型确定值。

参考资料

https://gfw.go101.org/article/operators.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • go运算符
    • 溢出
      • ++和–表达式
      • 关于算术运算的结果
        • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档