golang学习系列——9. 基本类型和运算符

目录

 

概念说明

基本类型

布尔类型 bool

字符类型

数字类型

整数类型

浮点型

其他数字类型

字符串类型

其他类型

运算符与优先级

算术运算符

关系运算符

逻辑运算符

位运算符

赋值运算符

其他运算符

运算符优先级

(伪)随机数生成


概念说明

表达式是一种特定的类型的值,它可以由其它的值以及运算符组合而成。

一元运算符只可以用于一个值的操作(作为后缀)
    例如:a++
二元运算符则可以和两个值或者操作数结合(作为中缀)。
    例如:a+b

只有两个类型相同的值才可以和二元运算符结合
要注意的是,Go 是强类型语言,因此不会进行隐式转换,任何不同类型之间的转换都必须显式说明。
Go 不存在像 C 和 Java 那样的运算符重载,表达式的解析顺序是从左至右。

优先级越高的运算符在条件相同的情况下将被优先执行。
但是可以通过括号将其中的表达式括起来,人为地提升某个表达式的运算优先级。

基本类型

布尔类型 bool

参考 c++/c# 的bool, 用来表示表达式的真、假

取值范围: true 、false

利用括号同样可以升级某个表达式的运算优先级。

在格式化输出时,你可以使用 %t 来表示你要输出的值为布尔型。

字符类型

严格来说,这并不是 Go 语言的一个类型,字符只是整数的特殊用例。

byte 类型是 uint8 的别名,对于只占用 1 个字节的传统 ASCII 编码的字符来说,完全没有问题。

在 ASCII 码表中,A 的值是 65,而使用 16 进制表示则为 41,所以下面的写法是等效的:

var ch byte = 65      //十进制
var ch byte = '\x41'  //十六进制
var ch byte = '\377'  //八进制

Go 同样支持 Unicode(UTF-8),因此字符同样称为 Unicode 代码点或者 runes,并在内存中使用 int 来表示。
在文档中,一般使用格式 U+hhhh 来表示,其中 h 表示一个 16 进制数。
其实 rune 也是 Go 当中的一个类型,并且是 int32 的别名。

var cx1 rune = 65
var cx2 rune = '\u0041'

格式化说明符 %c 用于表示字符;当和字符配合使用时,%v 或 %d 会输出用于表示该字符的整数;%U 输出格式为 U+hhhh 的字符串

包 unicode 包含了一些针对测试字符的非常有用的函数(其中 ch 代表字符):

判断是否为字母:unicode.IsLetter(ch)
判断是否为数字:unicode.IsDigit(ch)
判断是否为空白符号:unicode.IsSpace(ch)
这些函数返回一个布尔值。包 utf8 拥有更多与 rune 相关的函数。

数字类型

整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。

增加前缀 0 来表示 8 进制数(如:077)
增加前缀 0x 来表示 16 进制数(如:0xFF)
使用 e 来表示 10 的连乘(如: 1e3 = 1000,或者 6.022e23 = 6.022 x 1e23)。

格式化说明:
%d 用于格式化整数(%x 和 %X 用于格式化 16 进制表示的数字)
%g 用于格式化浮点型(%f 输出浮点数,%e 输出科学计数表示法)
%0nd 用于规定输出长度为n的整数,其中开头的数字 0 是必须的
%n.mg 用于表示数字 n 并精确到小数点后 m 位,除了使用 g 之外,还可以使用 e 或者 f,例如:使用格式化字符串 %5.2e 来输出 3.4 的结果为 3.40e+00
%v 来表示复数,但当你希望只表示其中的一个部分的时候需要使用 %f
%b 是用于表示位的格式化标识符

数据类型转换的时候,可能存在精度丢失的问题,实际应用中需要注意

整数类型

Go 也有基于架构的类型,例如:int、uint 和 uintptr。

序号 类型和描述
1 uint8
无符号 8 位整型 (0 到 255)
2 uint16
无符号 16 位整型 (0 到 65535)
3 uint32
无符号 32 位整型 (0 到 4294967295)
4 uint64
无符号 64 位整型 (0 到 18446744073709551615)
5 int8
有符号 8 位整型 (-128 到 127)
6 int16
有符号 16 位整型 (-32768 到 32767)
7 int32
有符号 32 位整型 (-2147483648 到 2147483647)
8 int64
有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)

浮点型

Go 语言中没有 float,double 类型

float32 精确到小数点后 7 位,float64 精确到小数点后 15 位。

由于精确度的缘故,你在使用 == 或者 != 来比较浮点数时应当非常小心。

尽可能地使用 float64,因为 math 包中所有有关数学运算的函数都会要求接收这个类型。

序号 类型和描述
1 float32
IEEE-754 32位浮点型数
2 float64
IEEE-754 64位浮点型数
3 complex64
32 位实数和虚数
4 complex128
64 位实数和虚数

其他数字类型

以下列出了其他更多的数字类型:

序号 类型和描述
1 byte
类似 uint8
2 rune
类似 int32
3 uint
32 或 64 位
4 int
与 uint 一样大小
5 uintptr
无符号整型,用于存放一个指针

字符串类型

字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。

Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。

其他类型

  • (a) 指针类型(Pointer)
  • (b) 数组类型
  • (c) 结构化类型(struct)
  • (d) Channel 类型
  • (e) 函数类型
  • (f) 切片类型
  • (g) 接口类型(interface)
  • (h) Map 类型

运算符与优先级

算术运算符

下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。

运算符 描述 实例
+ 相加 A + B 输出结果 30
- 相减 A - B 输出结果 -10
* 相乘 A * B 输出结果 200
/ 相除 B / A 输出结果 2
% 求余 B % A 输出结果 0
++ 自增 A++ 输出结果 11
-- 自减 A-- 输出结果 9

关系运算符

下表列出了所有Go语言的关系运算符。假定 A 值为 10,B 值为 20。

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

逻辑运算符

下表列出了所有Go语言的逻辑运算符。假定 A 值为 True,B 值为 False。

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

位运算符

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

下表列出了位运算符 &, |, 和 ^ 的计算:

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

Go 语言支持的位运算符如下表所示。假定 A 为60,B 为13:

运算符 描述 实例
& 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 (A & B) 结果为 12, 二进制为 0000 1100
| 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 (A | B) 结果为 61, 二进制为 0011 1101
^ 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (A ^ B) 结果为 49, 二进制为 0011 0001
<< 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 A << 2 结果为 240 ,二进制为 1111 0000
>> 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 A >> 2 结果为 15 ,

&^:位清除,将指定位置上的值设置为 0。

func testBit() {
	mask := 5
	fmt.Printf("%08b\n", mask)
	for i := 0; i <= mask; i++ {
		fmt.Printf("%d: %08b, %08b\n", i, mask&^i, i&^mask)
	}
}

golang学习系列——9. 基本类型和运算符_第1张图片

由于没有见过位清除这个东西,特地测试了一下,结果如上图所示

赋值运算符

下表列出了所有Go语言的赋值运算符。

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

其他运算符

下表列出了Go语言的其他运算符。

运算符 描述 实例
& 返回变量存储地址 &a; 将给出变量的实际地址。
* 指针变量。 *a; 是一个指针变量

运算符优先级

有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:

优先级 运算符
5 * / % << >> & &^
4 + - | ^
3 == != < <= > >=
2 &&
1 ||

当然,你可以通过使用括号来临时提升某个表达式的整体运算优先级。

(伪)随机数生成

函数 rand.Float32 和 rand.Float64 返回介于 [0.0, 1.0) 之间的伪随机数,其中包括 0.0 但不包括 1.0。

函数 rand.Intn 返回介于 [0, n) 之间的伪随机数。

你可以使用 Seed(value) 函数来提供伪随机数的生成种子,一般情况下都会使用当前时间的纳秒级数字

func testRand() {
	for i := 0; i < 10; i++ {
		a := rand.Int()
		fmt.Printf("%d  ", a)
		if i%2 == 1 {
			fmt.Println("")
		}
	}
	for i := 0; i < 5; i++ {
		r := rand.Intn(8)
		fmt.Printf("%d ", r)
	}
	fmt.Println()
	timens := int64(time.Now().Nanosecond())
	rand.Seed(timens)
	for i := 0; i < 10; i++ {
		fmt.Printf("%2.2f ", 100*rand.Float32())
		if i%2 == 1 {
			fmt.Println("")
		}
	}
}

你可能感兴趣的:(golang)