• Go学习之路:流程控制语句:for、if、else、switch 和 defer(DAY 1)



    前引


    由于这段时间 封闭在寝室 足不出寝 学习效率确实低了点
    基础语法部分这两天应该能学完 因为有基础学习起来还是相当快的

    写博客还是占了很多学习时间 但是不写博客也没学习动力
    那就这样吧 今天继续吧流程控制学一下


    流程控制语句:for、if、else、switch 和 defer


    1.1、for循环语句/语法格式(一)


    语法和c语言是差不多的 只是第一个
    取消了外面的括号 第二个 没有了++i 只剩下了i++

    其余和c语言一样 一样是 变量声明 循环条件 循环后变量更改


    不妨下面直接用斐波拉契数列的例子来写吧 下面是力扣斐波拉契的题 也算是我第一个GO语言刷力扣的题了

    在这里插入图片描述

    func fib(n int) int {
      const mod int = 1e9+7
      if n <= 1 {
        return n
      }
    
      pre1, pre2, now := 1, 0, 0
      for i := 2; i <= n; i++ {
        now = (pre1 + pre2) % mod
        pre2 = pre1
        pre1 = now
      }
      return now
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.2、for循环语句/省略前置后置语句(二)


    和c语言一样 可以取消前面分号 只有中间的条件 像c语言一样
    初始化语句 和 后置语句是可选

    例如上面的语句可以改为下面的语句

    func fib(n int) int {
      const mod int = 1e9+7
      if n <= 1 {
        return n
      }
    
      pre1, pre2, now := 1, 0, 0
      i := 2
      for ; i <= n; {
        now = (pre1 + pre2) % mod
        pre2 = pre1
        pre1 = now
        i += 1
      }
      return now
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.3、for循环语句/while(三)


    c语言中的while 也就是for语句取消了前面和后置语句
    所以while语句也不在了 也就直接被for取代了

    func fib(n int) int {
      const mod int = 1e9+7
      if n <= 1 {
        return n
      }
    
      pre1, pre2, now := 1, 0, 0
      i := 2
      for i <= n {
        now = (pre1 + pre2) % mod
        pre2 = pre1
        pre1 = now
        i++
      }
      return now
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.4、for循环语句/无限循环(四)


    由于while被for取代 而如果for语句中什么都不加
    等同于c语言中的while(1)

    c-style

    while (1) {}
    
    • 1

    go-style

    for {}
    
    • 1

    2.1、if语句/语法格式(一)


    和刚刚的for循环 差不多 基本格式只是取消掉括号
    例如下方的基本格式

    例如用例子连续一下if语句 一样还是用力扣中的题练手
    反转链表 最简单最基础的题型

    在这里插入图片描述

    /**
     * Definition for singly-linked list.
     * type ListNode struct {
     *     Val int
     *     Next *ListNode
     * }
     */
    func reverseList(head *ListNode) *ListNode {
      if head == nil || head.Next == nil {
        return head
      }
    
      var ret *ListNode = reverseList(head.Next);
      head.Next.Next = head
      head.Next = nil
      return ret
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.2、if语句/语句内声明变量


    简短语句 相比于c/c++ c++只有for语句内可以临时声明i变量 if语句内是严禁的
    而go语言内 if也可以临时声明个变量 例如下面的例子
    且if语句内用的 else还能用

    package main
    
    import (
    	"fmt"
    	"math"
    )
    
    func pow(x, n, lim float64) float64 {
    	if v := math.Pow(x, n); v < lim {
    		return v
    	}
    	return lim
    }
    
    func main() {
    	fmt.Println(
    		pow(3, 2, 10),
    		pow(3, 3, 20),
    	)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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),
    	)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    训练题:sqrt函数(力扣题目)


    69. x 的平方根
    在这里插入图片描述


    func mySqrt(x int) int {
      left, right := 0, x
      for left < right {
        mid := ((right - left) >> 1) + left + 1
        if mid * mid <= x {
          left = mid
        } else {
          right = mid - 1
        }
      }
      return left
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3、switch语句


    switch语句类似于其他语言 也类似于c/c++/java
    只是c/c++语言只允许case内部是整数 而go则允许除了整型数字的数 这样switch范围可使用的就大的多 可以去取代c语言中的很多if语句情形

    而且感觉switch确实会让语句可读性更高

    下面就是例子 下面的if - else if - else的case 和 switch的作用是差不多的

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	switch str := "string"; str {
    	case "int":
    		fmt.Println("int")
    	case "float32":
    		fmt.Println("float32")
    	case "float64":
    		fmt.Println("float64")
    	case "string":
    		fmt.Println("string")
    	default:
    		fmt.Println("other type")
    	}
    
    	if str := "string"; str == "int" {
    		fmt.Println("int")
    	} else if str == "float32"{
    		fmt.Println("float32")
    	} else if str == "float64" {
    		fmt.Println("float64")
    	} else if str == "string" {
    		fmt.Println("string")
    	} else {
    		fmt.Println("other type")
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    4、defer语句


    defer语句算是go语言的特有特性

    延迟调用 实现原理用栈将延迟调用的语句存储起来 之后外层语句结束后再将从栈存储的语句推出来 挨个调用

    例如下方 以及 反向输出10 - 0

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	defer fmt.Println("world!")
    	fmt.Print("hello ")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    package main
    
    import "fmt"
    
    func main() {
    	for i := 1; i <= 10; i++ {
    		defer fmt.Print(i, " ")
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    中国人民大学与加拿大女王大学金融硕士——顺势而为,掌握人生的方向盘
    Vue3自定义指令(directive)
    P1903 [国家集训队] 数颜色 / 维护队列
    小程序vant DropdownMenu 下拉菜单无法关闭
    2.证明 非单一点 Oct.2023
    【Java EE初阶二十二】https的简单理解
    电脑正常开机后几分钟就黑屏一直循环怎么办?
    stable diffusion Temporal-kit和EbSynth视频转动画学习笔记
    子组件自定义事件$emit实现新页面弹窗关闭之后父界面刷新
    【剑指Offer】34.二叉树中和为某一值的路径(二)
  • 原文地址:https://blog.csdn.net/qq_37500516/article/details/128054635