Go语言控制语句与指针语法详解
本文详解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语言基础教程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













