【极简 Golang 入门】控制结构

本贴最后更新于 1920 天前,其中的信息可能已经时过境迁

控制结构

Go 程序和大多数编程语言一样从 main() 函数开始执行,然后按顺序执行该函数体中代码。代码中必然需要进行条件判断,Go 中提供如下分支结构:

  • if-else
  • switch
  • select

Go 中同样有循环结构来重复执行某段代码:

  • for(range)

if-else 结构

if 是用于测试某个条件(布尔型或逻辑型)的语句,如果该条件成立,则会执行 if 后由大括号括起来的代码块。else 这个代码块中的代码只有在 if 条件不满足时才会执行。if 和 else 后的两个代码块是相互独立的分支,永远只会执行其中一个。

if condition {
	// do something
} else {
	// do something
}

如果需要 增加更多分支选择,可以使用 else if 。else-if 分支的数量是没有限制的,但是当选择条件过多时,应该使用 switch 。

if condition1 {
	// do something
} else if condition2 {
	// do something else
} else {
	// catch-all or default
}

if 可以包含一个初始化语句,常用于 err 的条件判断。

if initialization; condition {
	// do something
}

例如:

if err := fun(); err != nil {
	// do something
}

switch 结构

相比较 C/C++ 等其他语言而言,Go 语言中的 switch 结构使用非常灵活, 并且不需要 breake 语句来跳出。

switch value {
	case v1:
		...
	case v2:
		...
	default:
		...
}

value 变量可以是任何类型,v1 和 v2 是同类型的任意值或者是最终结果为相同类型的表达式,但不限于常量和整数。
同一个 case 可以匹配多个可能符合条件的值,通过逗号分割:

switch i {
case 0:
case 1, 2, 3:
	f() // 当 i == 1 或者 i == 2 或者 i == 3 则执行 f()
}

switch 语句可以不提供任何被判断的值,然后在每个 case 分支中进行测试不同的条件。当任一分支的测试结果为 true 时,该分支的代码会被执行。这看起来非常像链式的 if-else 语句。

switch {
case i < 0:
	f1()
case i == 0:
	f2()
case i > 0:
	f3()
}

switch 语句还可以包含一个初始化语句:

switch result := calculate(); {
	case result < 0:
		...
	case result > 0:
		...
	default:
		// 0
}
switch a, b := x[i], y[j]; {
case a < b:
	t = -1
case a == b:
	t = 0
case a > b:
	t = 1
}

因为 Go 的 switch 相当于每个 case 最后都自带一个 break ,匹配成功后就不会向下执行其他 case ,所以如果需要接着执行下一个 case 的可以使用 fallthrough 关键字。

	i := 2
	switch i {
	case 1:
		fmt.Println("1")
		fallthrough
	case 2:
		fmt.Println("2")
		fallthrough
	case 3:
		fmt.Println("3")
		fallthrough
	case 4:
		fmt.Println("4")
		fallthrough
	default:
		fmt.Println("default")

	}

输出:

2
3
4
default

fallthrough 只会强制执行下一个 case 。

	i := 2
	switch i {
	case 1:
		fmt.Println("1")
		fallthrough
	case 2:
		fmt.Println("2")
		fallthrough
	case 3:
		fmt.Println("3")
		// fallthrough
	case 4:
		fmt.Println("4")
		fallthrough
	default:
		fmt.Println("default")

	}

输出:

2
3

Go 中的 switch 还可以用来做类型判断。

package main

import "fmt"

func Type(v interface{}) {
	switch v.(type) {
	case bool:
		fmt.Println("bool")
	case float64:
		fmt.Println("float64")
	case int:
		fmt.Println("int")
	case nil:
		fmt.Println("nil")
	case string:
		fmt.Println("string")
	default:
		fmt.Println("default")
	}
}

func main() {
	Type(1)
	Type("")
	Type(true)
	Type(nil)
	i := 1
	Type(&i) // *int
}

输出:

int
string
bool
nil
default

for 结构

Go 中循环结构只有 for 语句,并没有 while 语句。

for 语句基本用法和其他语言无异:

for i := 0; i < 5; i++ {
	// do
}

支持多个变量控制循环:

for i, j := 0, 1; i < j; i, j = i+1, j-1 {
	// do
}

for 语句实现 while 语句功能:

var i int = 3

for i >= 0 {
	i--
	// do
}

无限循环:

for {

}
for i := 0; ; i++ {

} 
for {

}

Go 中还提供一个关键字用于循环结构 range ,它可以迭代任何一个集合(数组,map)。

for k, v := range s {
	// do
}

需要注意的是,v 对于元素的值拷贝,任何对 v 的修改都不会影响集合 s 。

break 和 continue

和其他语言一样,break 用于跳出整个循环,continue 用于跳出当前循环继续下一次循环。

for i := 0; i < 3; i++ {
	if i == 1 {
		continue
	}
	println(i)
}

输出:

0
2
for i := 0; i < 3; i++ {
	if i == 1 {
		break
	}
	println(i)
}

输出:

0
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1387 回帖 • 294 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...