Let's Go 2

Go 运算符

算术运算符

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

关系运算符

运算符描述实例
==检查两个操作数的值是否相等,如果相等则条件为真。(A == B) 为假。
!=检查两个操作数的值是否相等,如果不相等则条件为真。(A != B) 为真。
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。(A > B) 为假。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。(A < B) 为真。
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。(A >= B) 为假。
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。(A <= B) 为真。

逻辑运算符

运算符描述实例
&&如果两个操作数都非零,则条件为真。(A && B) 为假。
||如果两个操作数中有任意一个非零,则条件为真。(A || B) 为真。
!用来反转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。

位运算符

运算符描述实例
&如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。(A & B) 输出结果 12,二进制解释: 0000 1100
|如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。(A | B) 输出结果 61,二进制解释: 0011 1101
^如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。(A ^ B) 输出结果 49,二进制解释: 0011 0001
<<二进制左移运算符。左操作数的值向左移动右操作数指定的位数。A << 2 输出结果 240 ,二进制解释: 1111 0000
>>二进制右移运算符。左操作数的值向右移动右操作数指定的位数。A >> 2 输出结果 15 ,二进制解释: 0000 1111

赋值运算符

运算符描述实例
=简单的赋值运算符,将一个表达式的值赋给一个左值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

其他运算符

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

📚 运算符案例

算术运算符

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
package main

import "fmt"

func main() {
var a int = 21
var b int = 10
var c int

c = a + b
fmt.Printf("第一行 - c 的值为 %d\n", c)
c = a - b
fmt.Printf("第二行 - c 的值为 %d\n", c)
c = a * b
fmt.Printf("第三行 - c 的值为 %d\n", c)
c = a / b
fmt.Printf("第四行 - c 的值为 %d\n", c)
c = a % b
fmt.Printf("第五行 - c 的值为 %d\n", c)
a++
fmt.Printf("第六行 - a 的值为 %d\n", a)
a = 21 // 为了方便测试,a 这里重新赋值为 21
a--
fmt.Printf("第七行 - a 的值为 %d\n", a)
}

关系运算符

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
29
30
31
32
33
package main

import "fmt"

func main() {
var a int = 21
var b int = 10

if (a == b) {
fmt.Printf("第一行 - a 等于 b\n")
} else {
fmt.Printf("第一行 - a 不等于 b\n")
}
if (a < b) {
fmt.Printf("第二行 - a 小于 b\n")
} else {
fmt.Printf("第二行 - a 不小于 b\n")
}
if (a > b) {
fmt.Printf("第三行 - a 大于 b\n")
} else {
fmt.Printf("第三行 - a 不大于 b\n")
}
/* Lets change value of a and b */
a = 5
b = 20
if (a <= b) {
fmt.Printf("第四行 - a 小于等于 b\n")
}
if (b >= a) {
fmt.Printf("第五行 - b 大于等于 a\n")
}
}

逻辑运算符

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
package main

import "fmt"

func main() {
var a bool = true
var b bool = false
if (a && b) {
fmt.Printf("第一行 - 条件为 true\n")
}
if (a || b) {
fmt.Printf("第二行 - 条件为 true\n")
}
/* 修改 a 和 b 的值 */
a = false
b = true
if (a && b) {
fmt.Printf("第三行 - 条件为 true\n")
} else {
fmt.Printf("第三行 - 条件为 false\n")
}
if (!(a && b)) {
fmt.Printf("第四行 - 条件为 true\n")
}
}

位运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

func main() {
var a uint = 60 /* 60 = 0011 1100 */
var b uint = 13 /* 13 = 0000 1101 */
var c uint = 0

c = a & b /* 12 = 0000 1100 */
fmt.Printf("第一行 - c 的值为 %d\n", c)

c = a | b /* 61 = 0011 1101 */
fmt.Printf("第二行 - c 的值为 %d\n", c)

c = a ^ b /* 49 = 0011 0001 */
fmt.Printf("第三行 - c 的值为 %d\n", c)

c = a << 2 /* 240 = 1111 0000 */
fmt.Printf("第四行 - c 的值为 %d\n", c)

c = a >> 2 /* 15 = 0000 1111 */
fmt.Printf("第五行 - c 的值为 %d\n", c)
}

赋值运算符

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
29
30
31
32
33
34
35
36
37
38
39
40
package main

import "fmt"

func main() {
var a int = 21
var c int

c = a
fmt.Printf("第 1 行 - = 运算符实例,c 值为 = %d\n", c)

c += a
fmt.Printf("第 2 行 - += 运算符实例,c 值为 = %d\n", c)

c -= a
fmt.Printf("第 3 行 - -= 运算符实例,c 值为 = %d\n", c)

c *= a
fmt.Printf("第 4 行 - *= 运算符实例,c 值为 = %d\n", c)

c /= a
fmt.Printf("第 5 行 - /= 运算符实例,c 值为 = %d\n", c)

c = 200

c <<= 2
fmt.Printf("第 6行 - <<= 运算符实例,c 值为 = %d\n", c)

c >>= 2
fmt.Printf("第 7 行 - >>= 运算符实例,c 值为 = %d\n", c)

c &= 2
fmt.Printf("第 8 行 - &= 运算符实例,c 值为 = %d\n", c)

c ^= 2
fmt.Printf("第 9 行 - ^= 运算符实例,c 值为 = %d\n", c)

c |= 2
fmt.Printf("第 10 行 - |= 运算符实例,c 值为 = %d\n", c)
}

其他运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import "fmt"

func main() {
var a int = 4
var b int32
var c float32
var ptr *int

/* 运算符实例 */
fmt.Printf("第 1 行 - a 变量类型为 = %T\n", a)
fmt.Printf("第 2 行 - b 变量类型为 = %T\n", b)
fmt.Printf("第 3 行 - c 变量类型为 = %T\n", c)

/* & 和 * 运算符实例 */
ptr = &a /* 'ptr' 包含了 'a' 变量的地址 */
fmt.Printf("a 的值为 %d\n", a)
fmt.Printf("*ptr 为 %d\n", *ptr)
}

拓展

获取键盘输入

1
2
3
4
5
6
7
8
9
10
package main

import "fmt"

func main() {
var a int
fmt.Println("请输入一个整数:")
fmt.Scan(&a)
fmt.Println("你输入的整数是:", a)
}

编码规范

Go 语言中的变量名、函数名、常量名、包名、语句关键字等所有命名,都统一使用英文小写字母,多个单词之间用下划线分隔。

Go 条件语句

if 语句

1
2
3
4
5
6
7
8
9
10
11
package main

import "fmt"

func main() {
var a int = 10
if a < 20 {
fmt.Printf("a 小于 20\n")
}
fmt.Printf("a 的值为 : %d\n", a)
}

if…else 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func main() {
var a int = 100
if a < 20 {
fmt.Printf("a 小于 20\n")
} else {
fmt.Printf("a 不小于 20\n")
}
fmt.Printf("a 的值为 : %d\n", a)
}

if 嵌套语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {
var a int = 100
var b int = 200

if a == 100 {
if b == 200 {
fmt.Printf("a 的值为 100 , b 的值为 200\n")
}
}
fmt.Printf("a 值为 : %d\n", a)
fmt.Printf("b 值为 : %d\n", b)
}

switch 语句

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
29
30
31
32
33
package main

import "fmt"

func main() {
var grade string = "B"
var marks int = 90

switch marks {
case 90:
grade = "A"
case 80:
grade = "B"
case 50, 60, 70:
grade = "C"
default:
grade = "D"
}

switch {
case grade == "A":
fmt.Printf("优秀!\n")
case grade == "B", grade == "C":
fmt.Printf("良好\n")
case grade == "D":
fmt.Printf("及格\n")
case grade == "F":
fmt.Printf("不及格\n")
default:
fmt.Printf("差\n")
}
fmt.Printf("你的等级是 %s\n", grade)
}

fallthrough 语句

fallthrough 语句可以执行满足条件的 case 的下一个 case,是为了兼容 C 语言中的 case 设计的。

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
29
30
31
32
33
34
package main

import "fmt"

func main() {
var grade string = "B"
var marks int = 90

switch marks {
case 90:
grade = "A"
case 80:
grade = "B"
case 50, 60, 70:
grade = "C"
default:
grade = "D"
}

switch {
case grade == "A":
fmt.Printf("优秀!\n")
case grade == "B":
fmt.Printf("良好!\n")
fallthrough
case grade == "C":
fmt.Printf("及格!\n")
case grade == "D":
fmt.Printf("不及格!\n")
default:
fmt.Printf("差!\n")
}
fmt.Printf("你的等级是 %s\n", grade)
}

select 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import "fmt"

func main() {
var c1, c2, c3 chan int
var i1, i2 int
select {
case i1 = <-c1:
fmt.Printf("received ", i1, " from c1\n")
case c2 <- i2:
fmt.Printf("sent ", i2, " to c2\n")
case i3, ok := (<-c3): // same as: i3, ok := <-c3
if ok {
fmt.Printf("received ", i3, " from c3\n")
} else {
fmt.Printf("c3 is closed\n")
}
default:
fmt.Printf("no communication\n")
}
}

Go 循环语句

for 循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

func main() {
var b int = 15
var a int

numbers := [6]int{1, 2, 3, 5}

/* for 循环 */
for a := 0; a < 10; a++ {
fmt.Printf("a 的值为: %d\n", a)
}

for a < b {
a++
fmt.Printf("a 的值为: %d\n", a)
}

for i, x := range numbers {
fmt.Printf("第 %d 位 x 的值 = %d\n", i, x)
}
}

break 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import "fmt"

func main() {
var a int = 10

/* for 循环 */
for a < 20 {
fmt.Printf("a 的值为 : %d\n", a)
a++
if a > 15 {
/* 使用 break 语句跳出循环 */
break
}
}
}

continue 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
var a int = 10

/* for 循环 */
for a < 20 {
if a == 15 {
/* 跳过此次循环 */
a = a + 1
continue
}
fmt.Printf("a 的值为 : %d\n", a)
a++
}
}

goto 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import "fmt"

func main() {
/* 定义局部变量 */
var a int = 10

/* 循环 */
LOOP: for a < 20 {
if a == 15 {
/* 跳过迭代 */
a = a + 1
goto LOOP
}
fmt.Printf("a 的值为 : %d\n", a)
a++
}
}

历遍 string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import "fmt"

func main() {
var str string = "Go is a beautiful language!"
fmt.Printf("The length of str is: %d\n", len(str))
for pos, char := range str {
fmt.Printf("Character on position %d is: %c \n", pos, char)
}
fmt.Println()
str2 := "Japanese: 日本語"
fmt.Printf("The length of str2 is: %d\n", len(str2))
for pos, char := range str2 {
fmt.Printf("character %c starts at byte position %d\n", char, pos)
}
fmt.Println()
fmt.Println("index int(rune) rune char bytes")
for index, rune := range str2 {
fmt.Printf("%-2d %d %U '%c' % X\n", index, rune, rune, rune, []byte(string(rune)))
}
}

📚 循环语句案例

打印九九乘法表

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
for i := 1; i <= 9; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%d * %d = %d\t", j, i, i*j)
}
fmt.Println()
}
}

实测运行后报毒(雾)😒

打印 55 方阵

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
for i := 1; i <= 5; i++ {
for j := 1; j <= 5; j++ {
fmt.Printf("*")
}
fmt.Println()
}
}