Golang学习笔记(03-流程控制)

101 阅读3分钟

1. if 语句

1.1. if 语句的格式

if condition {
	coding
} else if condition {
	coding
} else {
	coding	
}

1.2. 案例

package main

import "fmt"
import "strings"

func main() {
	if sal := 15000; sal >= 20000 {  // 此时sal 为if 语句块中的局部变量
		fmt.Println("核心员工")
	} else if sal >= 15000 {
		fmt.Println("骨干员工")
	} else {
		fmt.Println("非核心员工")
	}
	
	id := "wb2020030501"
	if strings.HasPrefix(id, "wb") {
		fmt.Print("外包员工")
	}
}
e:\OneDrive\Projects\Go\src\gitee.com\studygo\day01\04-condition>go run main.go
骨干员工
外包员工

2. for循环

2.1. for语句格式

1.  循环式
    # 这种模式下,初始值可以放到for循环外,结束语句也可以放入循环体中
	  for 初始值; 条件; 结束语句 {
		    循环体
	  }

2.  迭代取值
    # 这种循环下,可以遍历字符串、数组等
    for a, b := range s {
        循环体
    }
    
3.  无限循环
    for {
        循环体
    }

2.2. 案例

package main

import "fmt"

func main() {
	for i := 1; i <= 9; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%dx%d=%d\t", j, i, j*i)
		}
		fmt.Println()
	}
}
e:\OneDrive\Projects\Go\src\gitee.com\studygo\day01\05-for>go run main.go
1x1=1
1x2=2   2x2=4
1x3=3   2x3=6   3x3=9
1x4=4   2x4=8   3x4=12  4x4=16
1x5=5   2x5=10  3x5=15  4x5=20  5x5=25
1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36
1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49
1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64
1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81

3. switch case

3.1. 几种场景

1.  判断一个变量的值是否等于某个值,其中name可以在switch之外赋值,也可以在switch内,如switch name := 1;name {}
    switch name {
    case v1:
        代码块
    case v2:
    代码块
    case v3:
        代码块
    default:  // 可选
        默认代码块
    }

2.  上述代码块的case可以使用一个值,也可以使用多个值
    switch name {
    case v1,v2,v3 :
        代码块
    case v4:
        代码块
    case v5:
        代码块
    default:
        默认代码块
    }

3.  判断对象放到case内部
    switch {
    case name > v1:
        代码块
    case name > v2:
        代码块
    case name > v3:
        代码块
    default:
        默认代码块
    }

3.2. 案例

3.2.1. 案例一

package main

import "fmt"

func main() {
	inputArg := "stop"
	switch inputArg {
	case "start":
		fmt.Println("systemctl start httpd")
	case "stop":
		fmt.Println("systemctl stop httpd")
	case "restart":
		fmt.Println("systemctl restart httpd")
	}
}

3.2.2. 案例二

package main

import "fmt"

func main() {
	switch serviceName := "MySQL"; serviceName {
	case "httpd", "nginx":
		fmt.Println("web service")
	case "docker", "kubernetes":
		fmt.Println("container service")
	case "Keepalived":
		fmt.Println("High ")
	default:
		fmt.Println("others service")
	}
}

3.2.3. 案例三

package main

import "fmt"

func main() {
	// 这段代码只是示例,没有实际意义
	switch port := 677724; {
	case port == 22:
		fmt.Println("sshd service")
	case port == 80 || port == 8080:
		fmt.Println("Web service")
	case port > 32768 && port < 65535:
		fmt.Println("others service")
	case port > 65535:
		fmt.Println("the port maybe error!")
	}
}

4. 跳出循环

4.1. break/continue

package main

import "fmt"

// 跳出循环: break/continue
func main() {
	var name string = "abcdef"
	for _, s := range name {
		if s == 'c' {
			continue
		} else if s == 'e' {
			break
		}
		fmt.Printf("%c\t", s)
	}
}
package main

import "fmt"

// 跳出多层循环
func main() {
	var flag bool
	for i := 1; i <= 9; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%d x %d = %d\t", j, i, j*i)
			if j > 5 {
				flag = true
				break
			}
		}
		if flag {
			break
		}
		fmt.Println()
	}
}

4.2. goto

goto语句是先定义一个label,这个标签内部写跳出循环时执行的语句,在循环体中当满足特定条件时,立刻跳到定义好的label代码块 , 这种在嵌套循环中非常好用。

package main

import "fmt"

// 对上述嵌套循环代码的简化
func main() {
	for i := 1; i <= 9; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%d x %d = %d\t", j, i, j*i)
			if j > 5 {
				goto BreakLoop
			}
		}
		fmt.Println()
	}
BreakLoop:
	fmt.Println()
}