Golang入门-流程控制

  • if
        var number int
        if number := 4; 100 > number {       //标识符的重声明:只要对同一个标识符的两次声明各自
            number += 3                        所在的代码块之间存在包含的关系,就会形成对该标识
        } else if 100 < number {               符的重声明。
            number -= 2
        } else {
            fmt.Println("OK!")
        }                                    //执行后 第二个number为7 第一个为0
  • switch
    1:表达式switch语句        //带初始化语句
    
    names := []string{"Golang", "Java", "Rust", "C"}
    switch name := names[0]; name {
    case "Golang":
        fmt.Println("A programming language from Google.")
    case "Rust":
        fmt.Println("A programming language from Mozilla.")
    default:
        fmt.Println("Unknown!")
    }
    
    2:类型switch语句
    
    v := 11
    switch i := interface{}(v).(type) {    //取变量的类型  interface{}($v).(type)
    case int, int8, int16, int32, int64:
        fmt.Printf("A signed integer: %d. The type is %T. \n", i, i)
    case uint, uint8, uint16, uint32, uint64:
        fmt.Printf("A unsigned integer: %d. The type is %T. \n", i, i)
    default:
        fmt.Println("Unknown!")
    }

      fallthrough。它既是一个关键字,又可以代表一条语句。fallthrough语句可被包含在表达式switch语句中的case语句中。它的作用是使控制权流转到下一个case。不过要注意,fallthrough语句仅能作为case语句中的最后一条语句出现。并且,包含它的case语句不能是其所属switch语句的最后一条case语句。

  • for
    map1 := map[int]string{1: "Golang", 2: "Java", 3: "Python", 4: "C"}
    for k,v := range map1 {
        fmt.Printf("%d: %s \n",k,v)
    }

     

  • select

       select语句属于条件分支流程控制方法,不过它只能用于通道。它可以包含若干条case语句,并根据条件选择其中的一个执行。进一步说,select语句中的case关键字只能后跟用于通道的发送操作的表达式以及接收操作的表达式或语句。

       如果一条select语句中不存在default case, 并且在被执行时其中的所有case都不满足执行条件,那么它的执行将会被阻塞!当前流程的进行也会因此而停滞。直到其中一个case满足了执行条件,执行才会继续。我们一直在说case执行条件的满足与否取决于其操作的通道在当时的状态。这里特别强调一点,即:未被初始化的通道会使操作它的case永远满足不了执行条件。对于针对它的发送操作和接收操作来说都是如此。
  
       break语句也可以被包含在select语句中的case语句中。它的作用是立即结束当前的select语句的执行,不论其所属的case语句中是否还有未被执行的语句。

    //输出 No Data   1   End.
    ch4 := make(chan int, 1)
	for i := 0; i < 4; i++ {
		select {
		case e, ok := <-ch4:
			if !ok {
				fmt.Println("End.")
				return
			}
			fmt.Println(e)
			
		default:
			fmt.Println("No Data!")
			
		}
	}                  
  • defer

   defer语句仅能被放置在函数或方法中。它由关键字defer和一个调用表达式组成。当一个函数中存在多个defer语句时,它们携带的表达式语句的执行顺序一定是它们的出现顺序的倒序。

//会输出回文  0 1 1 2 3 5 8 13 21 34 34 21 13 8 5 3 2 1 1 0 
func main() {
	for i := 0; i < 10; i++ {
        defer func(n int) {
              fmt.Printf("%d ", n)
        }(func() int {
              n := fibonacci(i)
        fmt.Printf("%d ", n)
         return n
        }())
		
		
	}
}

func fibonacci(num int) int {
	if num == 0 {
		return 0
	}
	if num < 2 {
		return 1
	}
	return fibonacci(num-1) + fibonacci(num-2)
}
  • error

   

type error interface { 
    Error() string
}

    errors.New是一个很常用的函数。在Go语言标准库的代码包中有很多由此函数创建出来的错误值,比如os.ErrPermissionio.EOF等变量的值

error是Go语言内置的一个接口类型

  • panic

       panic可被意译为运行时恐慌

       内建函数panicrecover是天生的一对。前者用于产生运行时恐慌,而后者用于“恢复”它。不过要注意,recover函数必须要在defer语句中调用才有效。因为一旦有运行时恐慌发生,当前函数以及在调用栈上的所有代码都是失去对流程的控制权。只有defer语句携带的函数中的代码才可能在运行时恐慌迅速向调用栈上层蔓延时“拦截到”它。

    defer func() {
      if p := recover(); p != nil {
          fmt.Printf("Fatal error: %s\n", p)
     }
    }()
  • go

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值