09《Go语言入门》运算符和其他编程语言的区别

重要知识点:

  • 很多人分不清前置自增和后置自增、前置自减和后置自减,而Go为了简单,只支持后置自增(a++)和后置自减(a–)。
  • Go中数组(Array)为值类型,相同维数且含有相同个数元素的数组才可以比较,每个元素都相同才相等。
  • 位运算符增加按位置零运算符 &^ ,规则:右1为0,右0为O(Original)。

⚡️这是我纯手写的《Go语言入门》,源码+文章,手把手教你入门Go。看了你就会!
⚡️文章中所有的代码我都放到了 github.com/GanZhiXiong/go_learning 这个仓库中!
⚡️看文章时,对照仓库中代码学习效果更佳哦!

算术运算符

编程语言中常用的运算符为:

1
2
3
4
5
6
7
+
-
*
/
% // 求余
++ // 自增
-- // 自减

自增又分为前置自增和后置自增;
自减又分为前置自减和后置自减。
很多人在学习C语言的时候就经常分不清前置和后置的区别。

无前置自增和前置自减

而Go为了简单,只支持后置自增(a++)和后置自减(a–)

09_operator_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
func TestIncrementDecrement(t *testing.T) {
a := 1
a++
// '++' unexpected
//++a
t.Log(a)

b := 1
b++
// '--' unexpected
//--b
t.Log(b)
}

比较运算符

常用的比较运算符为:

1
2
3
4
5
6
==
!=
>
<
>=
>=

Go的比较运算符和其他编程语言是一致的。

数组的比较

但是某些类型的比较方式又和其他编程语言不一样,比如用==比较数组。

在Java、JavaScript中数组是引用类型,数组用==比较时,比较的是两个数组的引用。

但是在Go中数组(Array)为值类型。
所以在比较数组的时候有如下规则:

  • Go中相同维数且含有相同个数元素的数组才可以比较
  • Go中数组每个元素都相同才相等
1
2
3
4
5
6
7
8
9
10
11
12
13
func TestCompareArray(t *testing.T) {
a := [...]int{1, 2, 3, 4}
//b := [...]int{1, 2, 3, 4, 5}
c := [...]int{1, 3, 2, 4}
d := [...]int{1, 2, 3, 4}

// Invalid operation: a==b (mismatched types [4]int and [5]int)
//t.Log(a==b)
// false
t.Log(a==c)
// true
t.Log(a==d)
}

那么你可能会问,Go中数组是值传递,很多时候我们为了节省内存,就想使用引用传递怎么办?
我们可以使用切片来解决,后面我会单独写一篇文章讲解切片。你可以关注下,相信会对你有所帮助。

逻辑运算符

常用的逻辑运算符为:

1
2
3
&&
||
!

位运算符

常用的位运算符为:

1
2
3
4
5
& // 按位与运算符
| // 按位或运算符
^ // 按位异或运算符(相同为0,不同为1)
<< // 左移运算符
>> // 右移运算符

和其他编程语言不同的是,Go增加了按位置零运算符。

按位置零运算符

1
&^

该运算符的规则为:

  • 只要右边的操作数位上为1,无论左边的操作数对应的位上为1还是0,结果都是0。(右1为0
  • 如果右边的操作数位上为0,结果为左边的操作数对应的位上的值。(右0为O(Original)

如果你知道原理了就不用记。其实原理也很简单。
原理就是:
go语言中按位取反写法是^, 所以 a&^b 其实是 a&(^b) 利用运算符优先级省略掉括号的写法而已。

1
2
3
4
1 &^ 0 // 1
1 &^ 1 // 0
0 &^ 1 // 0
0 &^ 0 // 0

还记得前面有一篇文章07《Go语言入门》测试用例、变量和常量里面讲到比特位常量吗!
这里我们可以使用按位置零运算符,快捷的设置文件类型

07_constant_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const (
Readable = 1 << iota // 0001 可读
Writable // 0010 可写
Executable // 0100 可执行
)

func TestConstant1(t *testing.T) {
t.Log(Readable, Writable, Executable)
//a := 7 // 7%2=1 3%2=1 1%2=1 0111
a := 1 // 1%2=1 0001
t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable)

// 下面演示09讲中的按位置零运算符
a = 7 // 0111
t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable)
a = a &^ Readable
a = a &^ Writable
a = a &^ Executable
t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable)

// 按位运算符其实就是运算符优先级省略掉括号的写法而已
b := Readable | Executable
t.Log(b&Readable == Readable, b&Writable == Writable, b&Executable == Executable)
t.Log(b&^Readable == Executable)
t.Log(b&^Executable == Readable)
t.Log(b&(^Readable) == Executable)
t.Log(b&(^Executable) == Readable)
}

09《Go语言入门》运算符和其他编程语言的区别

https://ganzhixiong.com/p/ec65d1ef/

Author

干志雄

Posted on

2021-01-12

Updated on

2021-01-12

Licensed under

Comments