Go语言控制语句与指针语法详解

林舟
林舟
发布时间:2026-10-15| 5人浏览过
原创

本文详解Go语言的核心控制语句,包括条件判断(if/switch)、多种形态的循环(for),并重点剖析指针的声明、取址、解引用及值传递原理,通过完整代码示例展示如何正确操控内存。

Go语言的条件判断结构

第1步:使用 if-else 进行逻辑分支

Go语言的 if-else 结构与多数编程语言相似,用于根据条件执行不同的代码块。需要注意 Go 中 if 后条件表达式无需括号包裹。

package main
import (
	"fmt"
)

func main() {
	str := "A"
	if str == "A" {
		fmt.Println("匹配成功")
	} else {
		fmt.Println("匹配失败")
	}
}

输出:匹配成功。若更改 str 的值,输出将变为“匹配失败”。虽然示例简单,但在实际开发中可通过嵌套或组合逻辑处理更复杂的判断。

第2步:使用 switch 进行多路分支匹配

switch 语句适合对特定变量与多个固定值进行比对,相比多层 if-else 更具可读性。Go 的 switch 默认会自动 break,不会穿透到下一个 case。

package main
import(
	"fmt"
)

func main() {
	var num int = 20
	switch num {
	case 10:
		fmt.Println("num = 10")
	case 20:
		fmt.Println("num = 20")
	case 30:
		fmt.Println("num = 30")
	default:
		fmt.Println("default = 0")
	}
}

输出:

num = 20

如果希望匹配成功后继续执行下一个 case(穿透),需显式添加 fallthrough 关键字:

var num int = 20
switch num {
case 10:
	fmt.Println("num = 10")
case 20:
	fmt.Println("num = 20")
	fallthrough
case 30:
	fmt.Println("num = 30")
default:
	fmt.Println("default = 0")
}

此时输出为两行:“num = 20” 和 “num = 30”。在复杂的多值判断场景下,switch 通常比深层嵌套的 if-else 更清晰。

Go语言的循环控制结构

Go 语言仅保留 for 这一个循环关键字,但其灵活性足以实现其他语言中 while、do-while 和 foreach 的所有功能。

第3步:标准 for 循环(含初始化、条件、修饰)

这是最接近 C 语言风格的循环形式,包含三个部分:初始化、条件判断和更新操作。

package main
import(
	"fmt"
)

func main(){
	var num int = 5
	// 注意:判断部分不需要括号 ()
	for i:=0; i

输出从 index 0 到 4。此处补充一个练习:打印金字塔形状的 G 字符。

package main
import(
	"fmt"
)

func main(){
	for i := 0; i < 5; i++ {
		G := ""
		for j := 0; j < i; j++ {
			G += "G"
		}
		fmt.Println(G + "G")
	}
}

第4步:类 while 循环(仅含条件)

省略初始化和更新部分,仅保留条件语句。这相当于其他语言中的 while 循环。需确保在循环体内有改变条件的逻辑,以免死循环。

package main
import(
	"fmt"
)

func main(){
	var num_2 int = 5
	for num_2 > 0 {
		fmt.Printf("num_is is %d \n", num_2)
		num_2--
	}
}

输出从 5 递减至 1。

第5步:无限循环(无条件)

只写 for 关键字,等同于 for true {}。这种形式常用于需要长期运行的服务或队列监听。必须配合 break 或 return 退出,否则会成为死循环。

package main
import(
	"fmt"
)

func main(){
	var num_3 int = 5
	for {
		if num_3 < 0 {
			break // 当条件满足时退出循环
		}
		fmt.Printf("num_3 is %d \n", num_3)
		num_3--
	}
}

同样输出从 5 到 0 的值。注释掉 break 即可观察其陷入死循环的行为。

第6步:range 遍历(类似 foreach)

for-range 是 Go 独有的高级特性,用于遍历数组、切片、字符串、Map 和 Channel。它自动返回索引(或键)和对应的值。

package main
import(
	"fmt"
)

func main(){
	strs := "Hello World!例子"
	for ins, char := range strs {
		fmt.Printf("str is index %d,value is %c \n", ins, char)
	}
}

输出显示了每个字符及其索引。需要注意的是,在 UTF-8 编码中,英文字母占 1 个字节,而中文汉字通常占 3 个字节。因此索引会跳跃增长(例如“例”之后直接从 12 跳到 15)。这在处理混合中英文字符串时需特别注意。

常用控制关键字说明

  • break:立即结束当前所在的最内层循环或 switch,跳出执行后续代码。
  • continue:跳过本次循环体剩余的代码,直接进入下一次迭代。
  • return:终止当前函数的执行并返回值(若有),函数结束后方执行 caller 的下行代码。

关于 goto 标签跳转,虽在 Go 中存在,但极不推荐使用。因其容易破坏代码结构、导致作用域混乱甚至引发难以排查的死循环,建议优先使用上述结构化控制流。

Go语言指针语法详解

Go 提供了指针以直接操作内存地址,但与 C/C++ 不同,Go 禁止指针运算(如指针加减整数),以保证内存安全。

第7步:声明指针与获取地址

  • 使用 * 声明指针类型,例如 var p *string。
  • 使用 & 取变量的内存地址,例如 p = &s。
  • 格式化输出地址使用 %p。
package main
import(
	"fmt"
)

func main() {
	s := "good bye"
	var p *string = &s // p 指向 s 的地址
	*p = "ciao"        // 通过指针解引用修改 s 的值

	fmt.Printf("指针地址: %p\n", p)
	fmt.Printf("指针P的值是: %s\n", *p)
	fmt.Printf("变量S的值是: %s\n", s)
}

典型输出:

指针地址: 0x2540820
指针P的值是: ciao
变量S的值是: ciao

原理解析: 指针变量 p 存储的是 s 所在内存块的地址。当通过 *p 写入新值 "ciao" 时,实际上是覆盖了该地址上的数据,因此原始变量 s 的值也随之改变。这正是指针作为“别名”访问同一内存区域的体现。

以上就是Go语言控制语句与指针语法的详细内容,更多关于Go语言基础教程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。