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

news2025/7/13 20:42:08

文章目录

    • 前引
    • 流程控制语句:for、if、else、switch 和 defer
      • 1.1、for循环语句/语法格式(一)
      • 1.2、for循环语句/省略前置后置语句(二)
      • 1.3、for循环语句/while(三)
      • 1.4、for循环语句/无限循环(四)
      • 2.1、if语句/语法格式(一)
      • 2.2、if语句/语句内声明变量
      • 训练题:sqrt函数(力扣题目)
      • 3、switch语句
      • 4、defer语句


前引


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

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


流程控制语句: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, " ")
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美新科技过会:收入依赖美国、产能利用率低,林东亮等均为香港籍

11月25日&#xff0c;深圳证券交易所创业板披露的信息显示&#xff0c;美新科技股份有限公司&#xff08;下称“美新科技”&#xff09;获得上市委会议通过。据贝多财经了解&#xff0c;美新科技于2022年3月31日在创业板递交上市申请。 本次冲刺创业板上市&#xff0c;美新科技…

SpringCloudGateway--谓词(断言)

目录 一、定义 二、谓词使用 1、After 2、Before 3、Between 4、Cookie 5、Header 6、Host 7、Method 8、Path 9、Query 10、RemoteAddr 11、Weight 一、定义 SpringCloudGateway中三个重要词汇&#xff1a; 路由&#xff08;Route&#xff09;&#xff1a;配置网…

傻白入门芯片设计,芯片键合(Die Bonding)(四)

目录 一、键合( Bonding) 1. 什么是键合(Bonding)&#xff1f; 2. 芯片键合步骤 3&#xff0e;芯片拾取与放置(Pick & Place) 4. 芯片顶出(Ejection)工艺 5. 使用环氧树脂(Epoxy)实现粘合的芯片键合工艺 6. 使用晶片黏结薄膜&#xff08;DAF&#xff09;的芯片键合工…

Redis实战篇(三)秒杀

一、全局唯一ID &#xff08;1&#xff09;定义 全局ID生成器&#xff0c;是一种在分布式系统下用来生成全局唯一ID的工具&#xff0c;一半满足下列特性&#xff1a; 唯一性高可用高性能递增性安全性 为了增加ID的安全性&#xff0c;我们不直接使用Redis自增的数值&#xf…

OpenCV-Python快速入门(十五):霍夫变换

OpenCV-Python快速入门&#xff08;十五&#xff09;&#xff1a;霍夫变换前言前提条件实验环境霍夫变换基本原理霍夫直线变换&#xff08;cv2.HoughLines()&#xff09;概率霍夫变换&#xff08;cv2.HoughLinesP()&#xff09;霍夫圆变换&#xff08;cv2.HoughCircles()&#…

移动端测试理论

App测试基础 App功能测试及专项测试 前言: 对于APP项目的测试&#xff0c;一般是进行系统测试。 测试主要从业务功能和非业务功能两个方面考虑。业务功能测试 根据软件说明&#xff0c;设计文档或用户需求验证App的各个功能的实现。 专项测试 兼容性测试 兼容性测试的关注点…

阿里Java研发面经(已拿offer)

一、自我总结&#xff1a; 1&#xff09;首先最重要的一点。对自己的要求高点。不要以简单的实习生来要求自己。你要想 你会的别人都会 你的核心竞争力是什么呢。所以楼主建议以Java高级工程师来要求自己。不会的就学嘛。人面对未知的事物 本能反应是恐惧与退缩。可当你尝试去…

Xxl-Job 初次体验

Xxl-Job 初次体验一、定时任务-前置知识二、演变机制三、xxl-Job 设计思想四、xxl-job 实战1. 调度中心部署2. 编写执行器简单使用一下2.1. 让执行器run起来&#xff01;2.2. 在调度中心配置任务&#xff0c;调度一下&#xff01;3. XxlJob 任务的生命周期4. 路由策略5. 父子任…

汇川PLC编程软件AutoShop的使用

文章目录一、数据类型二、系统参数.1、内存容量设置2、“掉电保持范围”设置3、系统设置三、符号表1、编辑符号表2、符号表的打印四、元件监控表1、新建元件监控表2、编辑元件监控表3、复制元件监控表4、快速监控表五、元件使用信息表六、交叉引用表七、软元件内存表1、新建和复…

windows的小米11真机appium微信爬虫

1、下载appium 仓库地址 2、下载python的包 pip install Appium-Python-Client -i https://pypi.tuna.tsinghua.edu.cn/simple 3、下载android-sdk 先下SDK Tools 国内一个镜像网站 参考这个教程 安装好后&#xff0c;运行这个SDK Manager.exe 然后install&#xff0c;同意协…

Alphalens使用方法细节判断

首先alphalens的数据格式&#xff1a; factor: MultiIndex&#xff08;用stack()方法来转换&#xff09; prices: DataFrame #转换成MultiIndex factor alpha_mom.stack() print (factor.tail()) datetime 2017-11-20 15:00:00 601857.XSHG 1…

小学生python游戏编程arcade----烟花粒子

小学生python游戏编程arcade----烟花粒子前言烟花粒子1、Vector向量类1.1 arcade中的向量类1.2 应用2、绘制粒子所有纹理图片2.1 给定直径和颜色的圆的纹理2.2 arcade.make_circle_texture函数原码2.3 make_soft_circle_texture 函数原码2.4 公共纹理代码3 效果图4 代码源码获取…

【读点论文】Densely Connected Convolutional Networks用残差连接大力出奇迹,进一步叠加特征图,以牺牲显存为代价

Densely Connected Convolutional Networks Abstract 如果卷积网络在靠近输入的层和靠近输出的层之间包含较短的连接&#xff0c;则卷积网络可以训练得更深入、更准确和有效。在本文中&#xff0c;接受了这种观察&#xff0c;并介绍了密集卷积网络(DenseNet)&#xff0c;它以…

Linux - Linux下Java安装路径查找;配置Java环境变量

一、查看Java的安装路径 1、已经安装好了JDK&#xff0c;也配置了环境变量 1、执行 java -version java -version 出现了版本号&#xff0c;表示安装过了JDK&#xff0c;配置了环境变量 2、在配置过jdk的情况下&#xff0c;执行java -verbose指令&#xff0c;在打印出的文本…

java stream中的peek()用法

文章目录前言最终操作&#xff08;terminal operation&#xff09;peek() vs forEach()peek() 的典型用法&#xff1a;协助调试总结前言 最近看到一段代码&#xff1a; aeFormList.stream().peek(object -> saveInfomation(object, params)).collect(Collectors.toList())…

std::shared_ptr(基础、仿写、安全性)

目录 一、c参考手册 1、解释说明 2、代码示例 3、运行结果 二、对std::shared_ptr分析 1、shared_ptr基础 2、创建shared_ptr实例 3、访问所指对象 4、拷贝和赋值操作 5、检查引用计数 三、仿写std::shared_ptr代码 1、单一对象 2、数组对象 四、shared_ptr遇到问…

MyBatis 环境搭建

MyBatis 环境搭建步骤 1.创建一张表和表对应的实体类 2.创建一个 maven 项目&#xff0c;把项目添加到 git 仓库 创建maven项目 教程见&#xff1a;Maven[项目构建工具]_chen☆的博客-CSDN博客 添加到git仓库&#xff1a; 3.在文件 pom.xml 添加 mybiatis 相关依赖(导入 MyBa…

Java - 利用Nacos做一个动态开关配置功能

Java - 利用Nacos做一个动态开关配置功能前言一. Nacos配置类编写二. 测试三. 展望前言 我公司里有一个Config配置功能&#xff08;我相信这是很普遍的一个功能&#xff09;。简单来说就是&#xff1a; 将相关的键值对放到这个Config配置系统里面。代码里通过这个Config配置系…

博客项目(前台功能实现)

博客项目(前台接口实现) 文章目录博客项目(前台接口实现)1.前置知识1.1Controller1.1.1ResponseResult类1.1.2该类的方法1.2Service1.3ServiceImpl1.4Mapper1.5Vo的理解1.6可能会用到的相关插件1.7设置字面量1.8后端接口测试工具2.热门文章接口分析2.1热门文章接口位置2.2接口的…

Internet Download Manager2023最新版下载器功能介绍

说到下载器在国内就不得不提迅雷&#xff0c;迅雷真是伟大&#xff0c;几乎垄断了国内的下载市场&#xff0c;的确&#xff0c;有的时候用迅雷可以下载到很不错的资源&#xff0c;但在没有VIP的情况下&#xff0c;迅雷是不友好的&#xff0c;相信使用迅雷的各位都有被限速过的经…