Go语言学习札记-Day03

目录

一、程序的流程结构

二、条件语句

2.1 if 语句

2.2 switch语句:

2.3 fallthrough

2.4 Type Switch

三、循环语句

1 for语句

四、跳出循环

1、 break语句

2、continue语句

五、goto语句


一、程序的流程结构

程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。

顺序结构:从上向下,逐行执行。

选择结构:条件满足,某些代码才会执行。0-1次   分支语句:if,switch,select

循环结构:条件满足,某些代码会被反复的执行多次。0-N次

二、条件语句

2.1 if 语句

if 布尔表达式 {
   /* 在布尔表达式为 true 时执行 */
} else {
  /* 在布尔表达式为 false 时执行 */
}

package main
import "fmt"
func main() {
   /* 定义局部变量 */
   var a int = 10
    /* 使用 if 语句判断布尔表达式 */
   if a < 20 {
       /* 如果条件为 true 则执行以下语句 */
       fmt.Printf("a 小于 20\n" )
   }
   fmt.Printf("a 的值为 : %d\n", a)
}
//还有一个变化体:
if statement; condition {  
}

if condition{
}

package main
import  "fmt"
func main() {  
    if num := 10; num % 2 == 0 { //checks if number is even
        fmt.Println(num,"is 偶数") 
    }  else {
        fmt.Println(num,"is 奇数")
    }
}

2.2 switch语句:

       计算表达式并将其与可能匹配的列表进行比较,并根据匹配执行代码块。每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。switch 语句执行的过程从上至下,直到找到匹配项,匹配项后不需break。如果switch没有表达式,它会匹配true。Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。
您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var grade string = "B"
   var marks int = 90

   switch marks {
      case 90: grade = "A"
      case 80: grade = "B"
      case 50,60,70 : grade = "C"  //case 后可以由多个数值
      default: grade = "D"  
   }

   switch {
      case grade == "A" :
         fmt.Printf("优秀!\n" )     
      case grade == "B", grade == "C" :
         fmt.Printf("良好\n" )      
      case grade == "D" :
         fmt.Printf("及格\n" )      
      case grade == "F":
         fmt.Printf("不及格\n" )
      default:
         fmt.Printf("差\n" );
   }
   fmt.Printf("你的等级是 %s\n", grade );      
}

2.3 fallthrough

如需贯通后续的case,就添加fallthrough

package main

import (
	"fmt"
)

type data [2]int

func main() {
	switch x := 5; x {
	default:
		fmt.Println(x)
	case 5:
		x += 10
		fmt.Println(x)
		fallthrough
	case 6:
		x += 20
		fmt.Println(x)

	}

}

运行结果:

15
35
case中的表达式是可选的,可以省略。如果该表达式被省略,则被认为是switch true,并且每个case表达式都被计算为true,并执行相应的代码块。

示例代码:

package main

import (  
    "fmt"
)

func main() {  
    num := 75
    switch { // expression is omitted
    case num >= 0 && num <= 50:
        fmt.Println("num is greater than 0 and less than 50")
    case num >= 51 && num <= 100:
        fmt.Println("num is greater than 51 and less than 100")
    case num >= 101:
        fmt.Println("num is greater than 100")
    }

}

switch的注意事项

  1. case后的常量值不能重复
  2. case后可以有多个常量值
  3. fallthrough应该是某个case的最后一行。如果它出现在中间的某个地方,编译器就会抛出错误。

2.4 Type Switch

switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
 

switch x.(type){
    case type:
       statement(s);      
    case type:
       statement(s); 
    /* 你可以定义任意个数的case */
    default: /* 可选 */
       statement(s);
}

package main

import "fmt"

func main() {
   var x interface{}
     
   switch i := x.(type) {
      case nil:	  
         fmt.Printf(" x 的类型 :%T",i)                
      case int:	  
         fmt.Printf("x 是 int 型")                       
      case float64:
         fmt.Printf("x 是 float64 型")           
      case func(int) float64:
         fmt.Printf("x 是 func(int) 型")                      
      case bool, string:
         fmt.Printf("x 是 bool 或 string 型" )       
      default:
         fmt.Printf("未知型")     
   }   
}
运行结果:

x 的类型 :<nil>

三、循环语句

循环语句表示条件满足,可以反复的执行某段代码。

for是唯一的循环语句。(Go没有while循环)

3.1 for语句

语法结构:

所有的三个组成部分,即初始化、条件和post都是可选的。

for init; condition; post { }

初始化语句只执行一次。在初始化循环之后,将检查该条件。如果条件计算为true,那么{}中的循环体将被执行,然后是post语句。post语句将在循环的每次成功迭代之后执行。在执行post语句之后,该条件将被重新检查。如果它是正确的,循环将继续执行,否则循环终止。

示例代码:
package main

import "fmt"

func main() {  
    for i := 1; i <= 10; i++ {
        fmt.Printf(" %d",i)
    }
}
在for循环中声明的变量仅在循环范围内可用。因此,i不能在外部访问循环。

四、跳出循环

1、 break语句

break:跳出循环体。break语句用于在结束其正常执行之前突然终止for循环

package main

import (  
    "fmt"
)

func main() {  
    for i := 1; i <= 10; i++ {
        if i > 5 {
            break //loop is terminated if i > 5
        }
        fmt.Printf("%d ", i)
    }
    fmt.Printf("\nline after for loop")
}

2、continue语句

continue:跳出一次循环。continue语句用于跳过for循环的当前迭代。在continue语句后面的for循环中的所有代码将不会在当前迭代中执行。循环将继续到下一个迭代。

package main

import (  
    "fmt"
)

func main() {  
    for i := 1; i <= 10; i++ {
        if i%2 == 0 {
            continue
        }
        fmt.Printf("%d ", i)
    }
}

五、goto语句

goto:可以无条件地转移到过程中指定的行。语法结构:goto label; .. .. label: statement;

package main
import "fmt"
func main() {
   /* 定义局部变量 */
   var a int = 10

   /* 循环 */
   LOOP: for a < 20 {
      if a == 15 {
         /* 跳过迭代 */
         a = a + 1
         goto LOOP
      }
      fmt.Printf("a的值为 : %d\n", a)
      a++     
   }  
}
统一错误处理
多处错误处理存在代码重复时是非常棘手的,例如:

		err := firstCheckError()
    if err != nil {
        goto onExit
    }
    err = secondCheckError()
    if err != nil {
        goto onExit
    }
    fmt.Println("done")
    return
onExit:
    fmt.Println(err)
    exitProcess()
发布了76 篇原创文章 · 获赞 113 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/m0_37676429/article/details/105747319
今日推荐