Administrator
Published on 2026-03-02 / 3 Visits
0
0

【Go语言学习-第3节】Go语言的操作符与表达式详解


运算符决定计算规则,表达式决定求值逻辑。
在 Go 语言中,操作符体系设计简洁、强类型、无隐式转换,是语言安全性与可读性的核心保障。


一、什么是表达式?

在 Go 中:

表达式(Expression)是可以计算并产生值的语法结构。

例如:

a + b
x > 10
a && b
1 << 3

表达式可以用于:

  • 变量赋值

  • 条件判断

  • 函数参数

  • 返回值计算


package main

import "fmt"

// add 是一个函数表达式示例
func add(a, b int) int {
	return a + b
}

func main() {
	a := 8
	b := 3
	c := 2

	fmt.Println("=== 算术表达式 ===")
	fmt.Println("a + b =", a+b)
	fmt.Println("a - b =", a-b)
	fmt.Println("a * b =", a*b)
	fmt.Println("a / b =", a/b)
	fmt.Println("a % b =", a%b)

	fmt.Println("\n=== 关系表达式 ===")
	fmt.Println("a > b =", a > b)
	fmt.Println("a == b =", a == b)
	fmt.Println("a != b =", a != b)

	fmt.Println("\n=== 逻辑表达式 ===")
	fmt.Println("(a > b) && (b > c) =", (a > b) && (b > c))
	fmt.Println("(a > b) || (b > c) =", (a > b) || (b > c))
	fmt.Println("!(a > b) =", !(a > b))

	fmt.Println("\n=== 位表达式 ===")
	fmt.Println("a & b =", a&b)
	fmt.Println("a | b =", a|b)
	fmt.Println("a ^ b =", a^b)
	fmt.Println("a << 1 =", a<<1)
	fmt.Println("a >> 1 =", a>>1)

	fmt.Println("\n=== 复合表达式 ===")
	result := (a + b) * c
	fmt.Println("(a + b) * c =", result)

	fmt.Println("\n=== 函数调用表达式 ===")
	fmt.Println("add(a, b) =", add(a, b))
}

二、Go 操作符分类总览

Go 的操作符主要分为六类:

算术操作符
关系操作符
逻辑操作符
位操作符
赋值操作符
其他特殊操作符

三、算术操作符

适用于数值类型。

操作符

含义

+

加法

-

减法

*

乘法

/

除法

%

取余

示例:

package main

import "fmt"

func main() {
	a := 8
	b := 3

	fmt.Println("=== 整数算术运算 ===")
	fmt.Println("a + b =", a+b) // 加法
	fmt.Println("a - b =", a-b) // 减法
	fmt.Println("a * b =", a*b) // 乘法
	fmt.Println("a / b =", a/b) // 整数除法
	fmt.Println("a % b =", a%b) // 取余

	fmt.Println("\n=== 浮点算术运算 ===")
	x := 8.0
	y := 3.0
	fmt.Println("x / y =", x/y) // 浮点除法
}

⚠ 注意:

  • 整数除法不会产生小数

  • % 仅适用于整数类型


四、关系操作符

比较两个值,返回布尔值。

操作符

含义

==

等于

!=

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

示例:

package main

import "fmt"

func main() {
	a := 8
	b := 3
	c := 8

	fmt.Println("=== 关系运算符示例 ===")

	fmt.Println("a > b  =", a > b)   // 大于
	fmt.Println("a < b  =", a < b)   // 小于
	fmt.Println("a >= b =", a >= b)  // 大于等于
	fmt.Println("a <= b =", a <= b)  // 小于等于
	fmt.Println("a == b =", a == b)  // 等于
	fmt.Println("a != b =", a != b)  // 不等于

	fmt.Println("\n=== 相同值比较 ===")
	fmt.Println("a == c =", a == c)
	fmt.Println("a != c =", a != c)
}

五、逻辑操作符

用于布尔表达式。

操作符

含义

&&

逻辑与

`

!

逻辑非

示例:

package main

import "fmt"

func main() {
	a := 8
	b := 3

	fmt.Println("=== 逻辑运算符示例 ===")

	// 逻辑与 &&
	fmt.Println("a > b && b > 0 =", a > b && b > 0)

	// 逻辑或 ||
	fmt.Println("a < b || b > 0 =", a < b || b > 0)

	// 逻辑非 !
	fmt.Println("!(a > b) =", !(a > b))

	fmt.Println("\n=== 短路机制演示 ===")

	// && 短路示例
	fmt.Println(false && test()) // test() 不会执行

	// || 短路示例
	fmt.Println(true || test()) // test() 不会执行
}

// test 用于观察是否执行
func test() bool {
	fmt.Println("test() 被调用")
	return true
}

短路特性(重要)

  • &&:左侧为 false,右侧不再执行

  • ||:左侧为 true,右侧不再执行


六、位操作符

适用于整数类型。

操作符

含义

&

按位与

`

`

^

按位异或

^x

按位取反

<<

左移

>>

右移

示例:

package main

import "fmt"

func main() {
	a := 8  // 二进制:00001000
	b := 3  // 二进制:00000011

	fmt.Println("=== 位运算示例 ===")

	fmt.Printf("a      = %08b (%d)\n", a, a)
	fmt.Printf("b      = %08b (%d)\n", b, b)

	// 按位与 &
	fmt.Printf("a & b  = %08b (%d)\n", a&b, a&b)

	// 按位或 |
	fmt.Printf("a | b  = %08b (%d)\n", a|b, a|b)

	// 按位异或 ^
	fmt.Printf("a ^ b  = %08b (%d)\n", a^b, a^b)

	// 左移 <<
	fmt.Printf("a << 1 = %08b (%d)\n", a<<1, a<<1)

	// 右移 >>
	fmt.Printf("a >> 1 = %08b (%d)\n", a>>1, a>>1)

	// 按位取反(单目 ^)
	fmt.Printf("^a     = %08b (%d)\n", ^a, ^a)
}

右移规则

  • 正数右移 → 高位补 0

  • 负数右移 → 高位补 1(算术右移)

Go 不支持无符号右移 >>>


七、赋值操作符

基本赋值

package main

import "fmt"

func main() {
	fmt.Println("=== 赋值运算符示例 ===")

	var a, b int = 8, 3

	// +=  等价于 a = a + b
	a = 8
	a += b
	fmt.Println("a += b  →", a)

	// -=  等价于 a = a - b
	a = 8
	a -= b
	fmt.Println("a -= b  →", a)

	// *=  等价于 a = a * b
	a = 8
	a *= b
	fmt.Println("a *= b  →", a)

	// /=  等价于 a = a / b
	a = 8
	a /= b
	fmt.Println("a /= b  →", a)

	// %=  等价于 a = a % b
	a = 8
	a %= b
	fmt.Println("a %= b  →", a)

	// <<= 等价于 a = a << b
	a = 8
	a <<= b
	fmt.Println("a <<= b →", a)

	// >>= 等价于 a = a >> b
	a = 8
	a >>= b
	fmt.Println("a >>= b →", a)

	// &=  等价于 a = a & b
	a = 8
	a &= b
	fmt.Println("a &= b  →", a)

	// |=  等价于 a = a | b
	a = 8
	a |= b
	fmt.Println("a |= b  →", a)

	// ^=  等价于 a = a ^ b
	a = 8
	a ^= b
	fmt.Println("a ^= b  →", a)
}

复合赋值

操作符

等价形式

+=

a = a + b

-=

a = a - b

*=

a = a * b

/=

a = a / b

%=

a = a % b

<<=

a = a << b

>>=

a = a >> b

&=

a = a & b

`

=`

^=

a = a ^ b


八、其他特殊操作符

操作符

用途

&

取地址

*

指针解引用

<-

channel 收发

:=

短变量声明

示例:

package main

import (
	"fmt"
)

func main() {
	fmt.Println("=== & 取地址 与 * 解引用 ===")

	x := 10          // := 短变量声明
	p := &x          // & 取地址
	fmt.Println("x 的值:", x)
	fmt.Println("x 的地址:", p)
	fmt.Println("通过指针访问:", *p) // * 解引用

	// 修改指针指向的值
	*p = 20
	fmt.Println("修改后的 x:", x)

	fmt.Println("\n=== <- channel 收发 ===")

	ch := make(chan int)

	// 启动 goroutine 发送数据
	go func() {
		ch <- 100 // 向 channel 发送数据
	}()

	value := <-ch // 从 channel 接收数据
	fmt.Println("接收到的值:", value)
}

九、操作符优先级

运算符具有优先级。

例如:

a + b * c

等价于:

a + (b * c)

常见优先级(高 → 低):

* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||

建议:

使用括号提升可读性,而非依赖优先级记忆。


package main

import "fmt"

func main() {
	fmt.Println("=== 算术优先级 ===")

	a := 2 + 3*4
	fmt.Println("2 + 3*4 =", a) // 先算 3*4

	b := (2 + 3) * 4
	fmt.Println("(2 + 3) * 4 =", b)

	fmt.Println("\n=== 位移优先级 ===")

	c := 1 + 2<<2
	fmt.Println("1 + 2<<2 =", c) // 先算 2<<2,再加 1

	d := (1 + 2) << 2
	fmt.Println("(1 + 2) << 2 =", d)

	fmt.Println("\n=== 比较优先级 ===")

	e := 5 > 3 && 2 < 4
	fmt.Println("5 > 3 && 2 < 4 =", e)

	fmt.Println("\n=== 位运算优先级 ===")

	f := 6 & 3 | 1
	fmt.Println("6 & 3 | 1 =", f) // 先算 & 再算 |

	g := 6 & (3 | 1)
	fmt.Println("6 & (3 | 1) =", g)

	fmt.Println("\n=== 逻辑优先级 ===")

	h := true || false && false
	fmt.Println("true || false && false =", h) // 先算 &&

	i := (true || false) && false
	fmt.Println("(true || false) && false =", i)
}

十、类型系统与表达式

Go 是强类型语言。

错误示例:

var a int = 10
var b int64 = 20
a + b // ❌ 类型不匹配

必须显式转换:

int64(a) + b

package main

import "fmt"

func main() {
	var a int = 10
	var b int64 = 20

	// ❌ 错误写法(取消注释会报错)
	// fmt.Println(a + b)

	// ✅ 正确写法:显式类型转换
	result := int64(a) + b
	fmt.Println("int64(a) + b =", result)

	// 反向转换
	result2 := a + int(b)
	fmt.Println("a + int(b) =", result2)

	fmt.Println("\n=== 表达式类型示例 ===")

	x := 5
	y := 2

	fmt.Println("x / y =", x/y)       // int
	fmt.Println("float64(x)/float64(y) =", float64(x)/float64(y))
}

十一、Go 表达式设计特点

Go 表达式体系具有:

  • 无隐式类型转换

  • 无运算符重载

  • 强类型约束

  • 语义清晰

  • 可读性优先

相比 C++ 更简洁,
相比 Java 更严格。


总结

Go 的操作符体系简洁、严谨、强类型。
表达式求值规则清晰,无隐式转换,提升了代码安全性与可维护性。

掌握操作符与表达式,是理解 Go 语法、并发模型与内存模型的基础。



Comment