前引
由于这段时间 封闭在寝室 足不出寝 学习效率确实低了点
基础语法部分这两天应该能学完 因为有基础学习起来还是相当快的
写博客还是占了很多学习时间 但是不写博客也没学习动力
那就这样吧 今天继续吧流程控制学一下
流程控制语句: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函数(力扣题目)
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