清水泥沙

golang基础(9.整形以及运算符)

go支持的整形

类型 长度(单位:字节) 说明 值范围 默认值
int8 1 带符号8位整型 -128~127 0
uint8 1 无符号8位整型,与 byte 类型等价 0~255 0
int16 2 带符号16位整型 -32768~32767 0
uint16 2 无符号16位整型 0~65535 0
int32 4 带符号32位整型,与 rune 类型等价 -2147483648~2147483647 0
uint32 4 无符号32位整型 0~4294967295 0
int64 8 带符号64位整型 -9223372036854775808~9223372036854775807 0
uint64 8 无符号64位整型 0~18446744073709551615 0
int 32位或64位 与具体平台相关 与具体平台相关 0
uint 32位或64位 与具体平台相关 与具体平台相关 0
uintptr 与对应指针相同 无符号整型,足以存储指针值的未解释位 32位平台下为4字节,64位平台下为8字节 0

在PHP中只有一种int类型且不区分符号,最大存储数量基于运行平台决定。在 32 位平台下其最大值为 20 亿左右(等同于 Go 语言中的 int32),64 位平台下的最大值通常是大约 9E18(等同于 Go 语言中的 int64),并且 PHP 中的整型不支持无符号类型,你可以通过 PHP_INT_MAX 常量在 PHP 中获取当前平台的最大整型值。在go中不同类型的int不支持类型自动转换,需要转换类型后才能进行运算

package main

import "fmt"

func main() {
	var num1 int32 = 10
	num2 := 8                       // 自动推导为int
	var num3 int = int(num1) + num2 // 需要对类型进行转换才可以运算
	fmt.Println(num3)
}

:::success 此外,可以通过增加前缀 0 来表示八进制数(如:077),增加前缀 0x 来表示十六进制数(如:0xFF),以及使用 E 来表示 10 的连乘(如:1E3 = 1000)。 :::

运算符

算数运算符

和 PHP 类似,Go 语言支持所有常规的整数四则运算:+、-、*、/ 和 %(取余运算只能用于整数),不过由于强类型的关系,在 Go 语言中,不同类型的整型值不能直接进行算术运算。比如

	var a int   = 8
	var b int32 = 10
	a+b

go也支持类似 PHP 或其他语言中的自增/自减运算符,即 ++/–,但是只能作为语句,不能作为表达式,且只能用作后缀,不能放到变量前面

int_value_1++  // 有效,int_value_1 的值变成 9
int_value_1 = int_value_1++ // 无效,编译报错
--int_value_1  // 无效,编译报错

也支持 +=、-=、*=、/=、%= 这种快捷写法

int_value_1 += int_value_1 // 18
int_value_1 -= int_value_1 // 0
int_value_1 *= int_value_1 // 81
int_value_1 /= int_value_1 // 1
int_value_1 %= int_value_1 // 0

比较运算符

和 PHP 类似,Go 语言支持以下几种常见的比较运算符: >、<、==、>=、<= 和 !=,比较运算符运行的结果是布尔值。不同类型的值不能放在一起比较,否则会报编译错处,如下

var a int  = 1
var b int8 = 2
a > b
不过,各种类型的整型变量都可以直接与字面常量进行比较
if a == 1 {
  fmt.Println("a = 1")
}

位运算符

位运算符以二进制的方式对数值进行运算(效率更高),和 PHP 类似,Go 语言支持以下这几种位运算符:

运算符 含义 结果
x & y 按位与 把 x 和 y 都为 1 的位设为 1
x | y 按位或 把 x 或 y 为 1 的位设为 1
x ^ y 按位异或 把 x 和 y 一个为 1 一个为 0 的位设为 1
^x 按位取反 把 x 中为 0 的位设为 1,为 1 的位设为 0,PHP 中对应的位运算符是 ~,与 C 语言一致
x « y 左移 把 x 中的位向左移动 y 次,每次移动相当于乘以 2
x » y 右移 把 x 中的位向右移动 y 次,每次移动相当于除以 2

逻辑运算符

与 PHP 类似,Go 语言也支持以下逻辑运算符:

运算符 含义 结果
x && y 逻辑与运算符(AND) 如果 x 和 y 都是 true,则结果为 true,否则结果为 false
x || y 逻辑或运算符(OR) 如果 x 或 y 是 true,则结果为 true,否则结果为 false
!x 逻辑非运算符(NOT) 如果 x 为 true,则结果为 false,否则结果为 true

运算符优先级

上面介绍的 Go 语言运算符优先级如下所示(由上到下表示优先级从高到低,或者数字越大,优先级越高):

6      ^(按位取反) !
5      *  /  %  <<  >>  &  &^
4      +  -  |  ^(按位异或)
3      ==  !=  <  <=  >  >=
2      &&
1      ||