Go语言学习——流程控制语句+指针

本文介绍了Go语言中的基本for循环,包括初始化、条件和后置语句,并展示了不同情况下的使用示例。此外,还讲解了if语句的简短形式以及与else配合的用法。接着,探讨了switch语句的执行机制,包括如何进行无条件匹配和使用fallthrough。最后,提到了defer关键字,解释了其推迟函数执行的特性以及在实际编程中的应用。
摘要由CSDN通过智能技术生成

for循环——Go语言中的唯一循环

基本的 for 循环由三部分组成,它们用分号隔开:

初始化语句:在第一次迭代前执行
条件表达式:在每次迭代前求值
后置语句:在每次迭代的结尾执行
(和Java十分相似)

package main

import "fmt"

func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		sum += i
	}
	//这是一个求0-9的总和循环
	fmt.Println(sum)
}

并且初始化语句和后置语句是可以选择写/不写的

package main

import "fmt"

func main() {
	sum := 1
	for ; sum < 1000; {
		sum -= -1
	}
	fmt.Println(sum)
}

(如果将中间的条件表达式也省略,那么for就是一个无限循环了)

if

同 for 一样, if 语句可以在条件表达式前执行一个简单的语句。

该语句声明的变量作用域仅在 if 之内。

package main

import (
	"fmt"
	"math"
)

func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	}//v的作用域在这里就为止了
	return lim
}

func main() {
	fmt.Println(
		pow(3, 2, 10),
		pow(3, 3, 20),
	)
}


if和else

if 的简短语句中声明的变量同样可以在任何对应的 else 块中使用

(在 main 的 fmt.Println 调用开始前,两次对 pow 的调用均已执行并返回其各自的结果。)

package main

import (
	"fmt"
	"math"
)

func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	} else {
		fmt.Printf("%g >= %g\n", v, lim)
	}
	// 这里开始就不能使用 v 了
	return lim
}

func main() {
	fmt.Println(
		pow(3, 2, 10),
		pow(3, 3, 20),
	)
}

switch

switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。

switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。

switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。

没有条件的 switch 同 switch true 一样。

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"
      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 );      
}

需要注意的是每一个switch里面的case var1/var2可以是任何类型,但是必须保持一致

defer

defer 语句会将函数推迟到外层函数返回之后执行。

推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。

package main

import "fmt"

func main() {
	defer fmt.Println("world")

	fmt.Println("hello")
}

//结果是hello world而不是world hello

defer栈

推迟的函数调用会被放入一个栈中,等到外层函数调用完毕后,按照先进后出的顺序出栈

package main

import "fmt"

func main() {
	fmt.Println("counting")

	for i := 5; i < 11; i++ {
		defer fmt.Println(i)
	}

	fmt.Println("done")
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值