飞道的博客

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

395人阅读  评论(0)


前引


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

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


流程控制语句: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、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.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.4、for循环语句/无限循环(四)


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

c-style

while (1) {
   }

go-style

for {
   }

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
}

 

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),
	)
}


 

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),
	)
}


 

训练题: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
}

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

 

4、defer语句


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

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

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

package main

import (
	"fmt"
)

func main() {
   
	defer fmt.Println("world!")
	fmt.Print("hello ")
}

package main

import "fmt"

func main() {
   
	for i := 1; i <= 10; i++ {
   
		defer fmt.Print(i, " ")
	}
}

转载:https://blog.csdn.net/qq_37500516/article/details/128054635
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场