Golang之路---02 基础语法——流程控制(if-else , switch-case , for-range , defer)
流程控制
条件语句——if-else
if 条件 1 {分支 1
} else if 条件 2 {分支 2
} else if 条件 ... {分支 ...
} else {分支 else
}
注:
- Golang编译器,对于 { 和 } 的位置有严格的要求,它要求 else if (或 else)和 两边的花括号,必须在同一行。
- 由于 Golang是强类型,所以要求你条件表达式必须严格返回布尔型的数据(nil 和 0 和 1 都不行)。
eg:
score:=70if score > 90{fmt.Println("优秀")}else if score >80{fmt.Println("良好")}else{fmt.Println("差")}
选择语句——switch-case
switch 表达式 {case 表达式1:代码块case 表达式2:代码块case 表达式3:代码块case 表达式4:代码块case 表达式5:代码块default:代码块
}
eg:
func main() {education := "本科"switch education{case "研究生":fmt.Println("是研究生")case "本科":fmt.Println("是研究生")case "高中":fmt.Println("是高中生")default:fmt.Println("学历未达标")}
}
- case后可以接多个条件,多个条件之间是
或的关系,用逗号相隔。
month := 2switch month{case 3,4,5:fmt.Println("春天")case 6,7,8:fmt.Println("夏天")case 9,10,11:fmt.Println("秋天")default:fmt.Println("未知")}
- case后接常量时,常量只能出现一次。
- switch后可以接函数,只要保证case后的值类型与函数的返回值一致即可。
score:=90switch judge(score){case true:fmt.Println("成绩合格")case false:fmt.Println("成绩不合格")}
循环语句——for-range
for [condition | ( init; condition; increment ) | Range]
{statement(s);
}
for 后可接三种类型表达式
- 接一个条件表达式
eg:
func main() {a:=1for a<= 5{fmt.Println(a)a++}
}
- 接三个表达式
三个表达式之间用;分隔
第一个表达式:初始化变量
第二个表达式:设置循环控制条件
第三个表达式:控制变量的变化
for a:=1 ; a<=5 ;a++{fmt.Println(a)}
- 接一个 range 表达式
range 后可接数组、切片,字符串等
由于 range 会返回两个值:索引和数据,若你后面的代码用不到索引,需要使用 _ 表示 。
myarr := [...]string{"apple","orange","pair"}for index,fruit := range myarr{/*0号的水果为apple1号的水果为orange2号的水果为pair*/fmt.Printf("%d号的水果为%s\n",index,fruit)}// for _,fruit := range myarr
- 不接表达式无限循环
Golang中没有while循环,当不加任何的判断条件时,就相当于你每次的判断都为true。可以使用break来退出循环体,也可以使用continue直接跳到下一循环。
func main() {i:=1for{if i>5{break}//1 2 3 4 5 fmt.Printf("%d ",i)i++}
}
延迟语句——defer
1.延迟调用
defer 的用法很简单,只要在后面跟一个函数的调用,就能实现将这个 xxx 函数的调用延迟到当前函数执行完后再执行。
func testfun(){fmt.Println("B")
}func main() {defer testfun()fmt.Println("A")
}
/*
A
B
*/
2.变量快照
使用 defer 只是延时调用函数,此时传递给函数里的变量,不应该受到后续程序的影响。
func main() {name := "fruit"defer fmt.Println(name)//后续调用 defer 的时候,仍然使用未重新赋值的变量值,就好在 defer 这里,给所有的这是做了一个快照一样。name = "roast chicken"fmt.Println(name)
}
/*
roast chicken
fruit
*/
3.多个defer反序调用
多个defer 是反序调用的,有点类似栈一样,后进先出。
func main() {name := "fruit"defer fmt.Println(name)name = "roast chicken"defer fmt.Println(name)name = "cabbage"defer fmt.Println(name)
}
/*
cabbage
roast chicken
fruit
*/
4.defer存在的意义
- 释放占用的资源
- 捕捉处理异常
- 输出日志
eg:
若是没有 defer,你可以写出这样的代码
func f() {r := getResource() //0,获取资源......if ... {r.release() //1,释放资源return}......if ... {r.release() //2,释放资源return}......if ... {r.release() //3,释放资源return}......r.release() //4,释放资源return
}
使用了 defer 后,代码就显得简单直接,不管你在何处 return,都会执行 defer 后的函数。
func f() {r := getResource() //0,获取资源defer r.release() //1,释放资源......if ... {...return}......if ... {...return}......if ... {...return}......return
}相关文章:
Golang之路---02 基础语法——流程控制(if-else , switch-case , for-range , defer)
流程控制 条件语句——if-else if 条件 1 {分支 1 } else if 条件 2 {分支 2 } else if 条件 ... {分支 ... } else {分支 else }注: Golang编译器,对于 { 和 } 的位置有严格的要求,它要求 else if (或 else)和 两边…...
HTTP——HTTP报文内的HTTP信息
HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回客户端的响应。本章就让我们来了解一下请求和响应是怎样运作的。 HTTP 一、HTTP报文二、请求报文及响应报文的结构三、编码提升传输速率1、报文主体和实体主题的差异2、压缩传输的内容编码3、分割发送的分块传输编…...
RocketMQ工作原理
文章目录 三.RocketMQ工作原理1.消息的生产消息的生产过程Queue选择算法 2.消息的存储1.commitlog文件目录与文件消息单元 2.consumequeue目录与文件索引条目 3.对文件的读写消息写入消息拉取性能提升 3.indexFile1.索引条目结构2.文件名的作用3.查询流程 4.消息的消费1.推拉消…...
Jenkins+Docker+Docker-Compose自动部署,SpringCloud架构公共包一个任务配置
前言 Jenkins和docker的安装,随便百度吧,实际场景中我们很多微服务的架构,都是有公共包,肯定是希望一个任务能够把公共包的配置加进去,一并构建,ok,直接上干货。 Jenkins 全局环境安装 pwd e…...
spring boot 2 配置上传文件大小限制
一、起因:系统页面上传一个文件超过日志提示的文件最大100M的限制,需要更改配置文件 二、经过: 1、在本地代码中找到配置文件,修改相应数值后交给运维更新生产环境配置,但是运维说生产环境没有这行配置,遂…...
Jmeter —— 录制脚本
1. 第一步:添加http代理服务器,在测试计划--》添加--》非测试元件--》http代理服务器 2. 第二步:添加线程组(这个线程组是用来放录制的脚本,不添加也可以,就直接放在代理服务器下) 测试计划--》…...
从零开始学Docker(一):Docker的安装部署
前述:本次学习与整理来至B站【Python开发_老6哥】老师分享的课程,有兴趣的小伙伴可以去加油啦,附链接 宿主机环境:RockyLinux 9 版本管理 Docker引擎主要有两个版本:企业版(EE)和社区版&#…...
【ROS 02】ROS通信机制
机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达、摄像头、GPS...)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是一个单独的进程,每一个进程都是独立运行的。更确切的讲,ROS是进程&#…...
uniapp 选择城市定位 根据城市首字母分类排序
获取城市首字母排序,按字母顺序排序 <template><view class"address-wrap" id"address"><!-- 搜索输入框-end --><template v-if"!isSearch"><!-- 城市列表-start --><view class"address-sc…...
flex盒子 center排布,有滚动条时,拖动滚动条无法完整显示内容
文章目录 问题示例代码解决问题改进后的效果 问题 最近在开发项目的过程中,发现了一个有趣的事情,与flex盒子有关,不知道算不算是一个bug,不过对于开发者来说,确实有些不方便,感兴趣的同学不妨也去试试。 …...
Workbox使用分享
一、简要介绍 1.1 什么是Workbox 官方文档原文: At this point, service workers may seem tricky. There’s lots of complex interactions that are hard to get right. Network requests! Caching strategies! Cache management! Precaching! It’s a lot to r…...
秋招算法备战第32天 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
122. 买卖股票的最佳时机 II - 力扣(LeetCode) 通过做差可以得到利润序列,然后只要利润需求的非负数求和就可以,因为这里没有手续费,某天买入之后买出可以等价为这几天连续买入卖出 class Solution:def maxProfit(se…...
Python状态模式介绍、使用
一、Python状态模式介绍 Python状态模式(State Pattern)是一种行为型设计模式,它允许对象在不同的状态下表现不同的行为,从而避免在代码中使用多重条件语句。该模式将状态封装在独立的对象中,并根据当前状态选择不同的…...
Github-Copilot初体验-Pycharm插件的安装与测试
引言: 80%代码秒生成!AI神器Copilot大升级 最近copilot又在众多独角兽公司的合力下,取得了重大升级。GitHub Copilot发布还不到两年, 就已经为100多万的开发者,编写了46%的代码,并提高了55%的编码速度。 …...
Spring AOP API详解
上一章介绍了Spring对AOP的支持,包括AspectJ和基于schema的切面定义。在这一章中,我们将讨论低级别的Spring AOP API。对于普通的应用,我们推荐使用前一章中描述的带有AspectJ pointcuts 的Spring AOP。 6.1. Spring 中的 Pointcut API 这一…...
分治法 Divide and Conquer
1.分治法 分治法(Divide and Conquer)是一种常见的算法设计思想,它将一个大问题分解成若干个子问题,递归地解决每个子问题,最后将子问题的解合并起来得到整个问题的解。分治法通常包含三个步骤: 1. Divid…...
super(Module_ModuleList, self).__init__()的作用是什么?
class Module_ModuleList(nn.Module):def __init__(self):super(Module_ModuleList, self).__init__()self.linears nn.ModuleList([nn.Linear(10, 10)])在这段代码中,super(Module_ModuleList, self).__init__() 的作用是调用父类 nn.Module 的 __init__ 方法&…...
【并发专题】操作系统模型及三级缓存架构
目录 课程内容一、冯诺依曼计算机模型详解1.计算机五大核心组成部分2.CPU内部结构3.CPU缓存结构4.CPU读取存储器数据过程5.CPU为何要有高速缓存 学习总结 课程内容 一、冯诺依曼计算机模型详解 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时,先从内存中…...
java基础复习(第二日)
java基础复习(二) 1.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被 synchronized修饰? 都不能。 抽象方法需要子类重写…...
Ansible自动化运维工具
Ansible自动化运维工具 一、ansible介绍二、ansible环境安装部署三、ansible命令行模块1、command模块2、shell模块3、cron模块4、user模块5、group模块6、copy模块7、file模块8、hostname模块9、ping模块10、yum模块11、service/systemd模块12、script模块13、mount模块14、ar…...
Local AI Needs to Be the Norm — A Beginner’s Guide for Developers
Local AI Needs to Be the Norm — A Beginner’s Guide for Developers You’ve probably noticed it: more and more developers are running large language models on their laptops—not as a curiosity, but as part of daily workflow. Not just toy experiments, but …...
3D-LLM:面向可制造性的三维语言模型技术解析
1. 项目概述:当大语言模型开始“看见”三维空间“From Text to Tangible: 3D-LLM Unleashes Language Models into the 3D World”——这个标题不是科幻小说的副标题,而是2024年真实出现在CVPR和ICML顶会workshop上的技术路线宣言。我第一次在arXiv上读到…...
为了还原具身智能科研市场的全貌,我们找了多个头部高校聊聊
具身智能「最大客户说」 在具身智能所有喧嚣的落地故事里,科研市场是最沉默也最关键的那一个。 这是无数创业公司拿到的第一笔真正意义上的收入,帮助团队度过了最艰难的从0到1的商业化探索阶段,也让机器人本体在成百上千次的拆解、改装、调…...
WeChatFerry:微信机器人自动化框架的终极技术指南
WeChatFerry:微信机器人自动化框架的终极技术指南 【免费下载链接】WeChatFerry 微信机器人,可接入DeepSeek、Gemini、ChatGPT、ChatGLM、讯飞星火、Tigerbot等大模型。微信 hook WeChat Robot Hook. 项目地址: https://gitcode.com/GitHub_Trending/w…...
Nodejs后端服务集成Taotoken实现智能客服对话
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Node.js 后端服务集成 Taotoken 实现智能客服对话 为客服系统引入智能对话能力,是提升服务效率与用户体验的有效路径。…...
CH341驱动安装避坑指南:为什么你的串口能识别,但I2C/SPI功能却用不了?
CH341驱动安装避坑指南:为什么你的串口能识别,但I2C/SPI功能却用不了? 刚拿到CH341模块时,很多开发者都会遇到一个诡异现象:USB转串口功能一切正常,但切换到I2C或SPI模式时,设备管理器里却怎么也…...
Asimov支持的开发依赖类型详解:从Node.js到Python、Go、Rust全覆盖
Asimov支持的开发依赖类型详解:从Node.js到Python、Go、Rust全覆盖 【免费下载链接】asimov Automatically exclude development dependencies from Apple Time Machine backups 项目地址: https://gitcode.com/gh_mirrors/as/asimov Asimov是一款能够自动将…...
KMS智能激活工具:三步永久激活Windows和Office系统完整指南
KMS智能激活工具:三步永久激活Windows和Office系统完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然变…...
LeetCode 409:最长回文串 | 哈希表统计字符频率
LeetCode 409:最长回文串 | 哈希表统计字符频率 引言 最长回文串(Longest Palindrome)是 LeetCode 第 409 题,难度为 Easy。题目要求在给定字符串中构造最长的回文串,返回其长度。这道题虽然简单,但蕴含了回…...
Chrome无痕模式下Selenium BiDi协议断连原因与解决方案
1. 这个问题不是“能不能用”,而是“为什么一开无痕就断连”我第一次在CI流水线里跑通Chrome DevTools Protocol(CDP)自动化时,兴奋地加了--incognito参数想让测试更干净——结果WebDriver直接抛出org.openqa.selenium.devtools.D…...
