当前位置: 首页 > news >正文

Golang学习历程【第七篇 闭包type defer panic recover了解time包】

Golang学习历程【第七篇 闭包&type defer panic recover了解】

  • 1. 闭包
    • 1.1 闭包的定义
    • 1.2 闭包的特点
    • 1.3 闭包的示例
  • 2. 类型(type)
    • 2.1 自定义类型
    • 2.2 类型示例
  • 3. 延迟执行(Defer)
    • 3.1 `defer` 的用法
    • 3.2 `defer` 示例
  • 4. 恐慌(Panic)和恢复(Recover)
    • 4.1 `panic` 和 `recover` 的用法
    • 4.2 `panic` 和 `recover` 示例
  • 5. time包

1. 闭包

1.1 闭包的定义

闭包函数(Closure)是函数式编程中的一个重要概念。在Go语言中,闭包函数是指一个函数与其引用的环境的组合。闭包函数可以访问并修改其外部函数中的变量,即使外部函数已经执行完毕。

1.2 闭包的特点

  1. 闭包函数可以访问其外部函数的局部变量。
  2. 闭包函数可以修改其外部函数的局部变量。
  3. 闭包函数可以保持其外部函数的局部变量在函数执行完毕后仍然存在。

1.3 闭包的示例

package mainimport "fmt"/*** 闭包* 一个函数和与其相关的引用环境组合而成的实体*/
func adder() func(int) int {sum := 0// 返回一个函数,函数引用了sum变量return func(x int) int {// 函数引用了sum变量sum += xreturn sum}
}
func main() {// 调用adder函数,返回一个函数,这个函数引用了sum变量pos, neg := adder(), adder()for i := 0; i < 10; i++ {// 调用返回的函数,函数引用了sum变量fmt.Println(pos(i), neg(-2*i)) }/**- `adder` 函数返回一个闭包。每个闭包都绑定了自己的 `sum` 变量。- `pos` 和 `neg` 是两个独立的闭包,它们各自维护自己的 `sum`。运行结果0 01 -23 -66 -1210 -2015 -3021 -4228 -5636 -7245 -90*/
}

2. 类型(type)

2.1 自定义类型

Go 允许使用 type 关键字定义新的类型。

2.2 类型示例

package mainimport "fmt"// 自定义一个函数类型,类型名:addFun
type addFun func(int) int// 自定义一个int类型,类型名:selfint
type selfint intfunc adder2(x int) addFun {return func(y int) int {return x + y}
}
func main() {// 定义一个eg函数,其类型为addFun,是一个函数类型var eg addFun = adder2(10)// 调用eg函数 ,eg函数是adder2函数的返回闭包函数,执行eg ==> adder2(10) + y ==> 10 + 15 = 25fmt.Println(eg(15))var num1 selfint = 10var num2 int = 20// 自定义类型selfint,不能直接与int类型进行运算,需要转换fmt.Println(num1 + selfint(num2))// 或者使用类型转换fmt.Println(int(num1) + num2)/*** 运行结果:* 25* 30* 30*/
}

3. 延迟执行(Defer)

3.1 defer 的用法

defer 语句会将其后面的函数调用推迟到外层函数返回之后执行。

3.2 defer 示例

package mainimport "fmt"func main() {// defer 是一个关键字,用于延迟执行一个函数调用,直到包含该 defer 语句的函数执行完毕。defer fmt.Println("world")fmt.Println("hello")/** 运行结果:* hello* world*/
}

4. 恐慌(Panic)和恢复(Recover)

Panic相当与抛出异常,Recover相当于捕获异常,Golang中没有try…catch

4.1 panicrecover 的用法

  • panic 用于表示程序遇到了无法处理的错误。
  • recover 用于从 panic 中恢复。

4.2 panicrecover 示例

package mainimport "fmt"func main() {// 定义一个延时函数并执行defer func() {// 延时函数,等待主线程执行结束,捕获panicif r := recover(); r != nil {// 打印panic信息fmt.Println("Recovered from", r)}}()// 执行语句 Starting the programfmt.Println("Starting the program")// 触发panic 相当于触发java的throw new Exception()panic("Something went wrong!")// 下面语句不会被执行fmt.Println("This line will not be executed")/** 运行结果:* - `panic` 触发了一个恐慌,程序会中止执行。- `recover` 捕获了恐慌,程序继续执行。* Starting the program* Recovered from Something went wrong!*/
}

5. time包

time包是Go语言标准库中提供的一个用于处理时间的包,它提供了时间相关的函数和数据类型,可以用于获取当前时间、格式化时间、解析时间等操作。
time包中的Now函数可以获取当前时间,它返回一个Time类型的值,表示当前时间。下面是一个简单的示例:

// 1. 获取当前时间
currentTime := time.Now()
fmt.Println("当前时间:", currentTime)
// 2. 获取当前时间的年、月、日、时、分、秒等信息
year := currentTime.Year()
month := currentTime.Month()
day := currentTime.Day()
hour := currentTime.Hour()
minute := currentTime.Minute()
second := currentTime.Second()
fmt.Printf("当前时间:%d年%d月%d日 %d时%d分%d秒\n", year, month, day, hour, minute, second)
// 3. 格式化时间
// time包提供了Format函数用于格式化时间,它接受一个格式字符串作为参数,返回一个字符串表示格式化后的时间。下面是一个简单的示例:
fmt.Println("格式化时间:", currentTime.Format("2006-01-02 15:04:05"))
// 4. 解析时间
// time包提供了Parse函数用于解析时间,它接受一个格式字符串和一个时间字符串作为参数,返回一个Time类型的值表示解析后的时间。下面是一个简单的示例:
timeStr := "2023-01-01 12:00:00"
parsedTime, err := time.Parse("2006-01-02 15:04:05", timeStr)
if err != nil {fmt.Println("解析时间失败:", err)return
}
fmt.Println("解析时间:", parsedTime)
// 5. 时间间隔
// time包提供了Duration类型表示时间间隔,它表示两个时间点之间的时间差。下面是一个简单的示例:
duration := time.Duration(10) * time.Second
fmt.Println("时间间隔:", duration)
// 6. 时间操作
// time包提供了Add函数用于将时间间隔添加到时间上,返回一个新的时间。下面是一个简单的示例:
newTime := currentTime.Add(duration)
fmt.Println("新时间:", newTime)
// 7. 时间比较
// time包提供了Before、After和Equal函数用于比较两个时间的大小关系。下面是一个简单的示例:
if currentTime.Before(parsedTime) {fmt.Println("当前时间在解析时间之前")
} else if currentTime.After(parsedTime) {fmt.Println("当前时间在解析时间之后")
} else {fmt.Println("当前时间与解析时间相等")
}
if currentTime.Equal(parsedTime) {fmt.Println("当前时间与解析时间相等")
}
/*** 以上运行结果:* 当前时间: 2023-10-13 10:18:00.0000007 +0800 CST m=+0.000014679* 当前时间: 2023年10月13日 10时18分0秒* 格式化时间: 2023-10-13 10:18:00* 解析时间: 2023-01-01 12:00:00 +0000 UTC* 时间间隔: 10s* 新时间: 2023-10-13 10:28:00.0000007 +0800 CST m=+10.000014679* 当前时间在解析时间之前* 当前时间与解析时间不相等*/

总结:

  1. 获取当前时间: time.Now()
  2. 获取时间的详细信息: currentTime.Year() | currentTime.Month() | currentTime.Day() | currentTime.Hour() | currentTime.Minute() | currentTime.Second()
  3. 格式化时间: currentTime.Format(“2006-01-02 15:04:05”)
  4. 解析时间: time.Parse(“2006-01-02 15:04:05”, timeStr)
  5. 时间间隔: time.Duration(10) * time.Second
  6. 时间操作: currentTime.Add(duration)
  7. 时间比较: currentTime.Before(parsedTime) | currentTime.After(parsedTime) | currentTime.Equal(parsedTime)

上一篇:Golang学习历程【第六篇 复合数据类型map&函数初识】
下一篇:Golang学习历程【第八篇 指针、结构体】 待续中。。。

相关文章:

Golang学习历程【第七篇 闭包type defer panic recover了解time包】

Golang学习历程【第七篇 闭包&type defer panic recover了解】 1. 闭包1.1 闭包的定义1.2 闭包的特点1.3 闭包的示例 2. 类型(type)2.1 自定义类型2.2 类型示例 3. 延迟执行&#xff08;Defer&#xff09;3.1 defer 的用法3.2 defer 示例 4. 恐慌&#xff08;Panic&#xf…...

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用&#xff1a;1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织&#xff08;合并/删除&#xff09; oracle表分区…...

使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理

2023 年 11 月&#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元&#xff08;数据集和数据加载器&#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_monotonic_time函数

声明 在 src\core\ngx_times.c 中&#xff1a; static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec); 实现 在 src\core\ngx_times.c 中&#xff1a; static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)st…...

业务开发 | 基础知识 | Maven 快速入门

Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中央信息中管理项目的构建&#xff0c;报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…...

基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程

以下是一个基于 Python&#xff08;Flask&#xff09;、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程&#xff1a; --- ### 一、技术选型 1. **后端**&#xff1a;Python Flask&#xff08;轻量级Web框架&#xff09; 2. **前端**&#xff1a;HTML/CSS JavaScript&…...

STM32 RCC功能说明 复位和时钟控制RCC

目录 背景 RCC配置时钟主要涉及两方面 程序 第1步、RCC默认初始化 第2步、等待HSE工作稳定 第3步、设置PLL时钟源以及倍频数 第4步、设置AHB总线时钟&#xff08;HCLK&#xff09; 第5步、设置PCLK1(APB1总线) 第6步、设置PCLK2(APB2总线) 第7步、FLASH存储器的配置 …...

Windows可以永久暂停更新了

最终效果图&#xff1a; 第一步&#xff1a; winR组合键打开运行对话框&#xff0c;输入“regedit”&#xff0c;点击“确定”或回车&#xff1a; 第二步&#xff1a; 注册表定位到“\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”&#xff0c;新建DWO…...

高级 Python Web 开发:基于 FastAPI 构建高效实时聊天系统与并发控制

高级 Python Web 开发&#xff1a;基于 FastAPI 构建高效实时聊天系统与并发控制 目录 &#x1f310; WebSocket 实时通讯概述&#x1f4ac; FastAPI 中实现 WebSocket 聊天系统&#x1f527; WebSocket 并发控制与性能优化&#x1f512; WebSocket 安全性与认证机制&#x1…...

深入理解Java虚拟机(JVM)

JVM概述 JVM作用 java虚拟机负责装载字节码到其内部&#xff0c;解释/编译为对应平台上的机器码指令执行&#xff0c;通俗说就是将字节码转换为机器码 JVM内部构造 1、类加载部分&#xff1a;负责把硬盘上的字节码加载到内存中&#xff08;运行时数据区&#xff09; 2、运…...

笔试面试——逻辑题

1.n从1开始&#xff0c;每个操作可以选择对n加1或者对n加倍&#xff0c;若想获得整数2014&#xff0c;最少需要多少个操作。 2.一个池塘&#xff0c;养龙虾若干&#xff0c;请想一个办法尽量准确的估算其中有多少龙虾? 3. S先生&#xff0c;P先生&#xff0c;Q先生他们知道桌子…...

【深度学习入门实战】基于Keras的手写数字识别实战(附完整可视化分析)

​ 本人主页:机器学习司猫白 ok,话不多说,我们进入正题吧 项目概述 本案例使用经典的MNIST手写数字数据集,通过Keras构建全连接神经网络,实现0-9数字的分类识别。文章将包含: 关键概念图解完整实现代码训练过程可视化模型效果深度分析环境准备 import numpy as np impo…...

软考高级《系统架构设计师》知识点(一)

计算机硬件 校验码 码距&#xff1a;就单个编码A:00而言&#xff0c;其码距为1&#xff0c;因为其只需要改变一位就变成另一个编码。在两个编码中&#xff0c;从A码到B码转换所需要改变的位数称为码距&#xff0c;如A:00要转换为B:11&#xff0c;码距为2。一般来说&#xff0c;…...

用大模型学大模型01-制定学习计划

提示词&#xff1a;我想学习大模型&#xff0c;需要AI制定一个完整的学习计划&#xff0c;并给出学习路径和学习资料。以教科书目录的方式给出学习路线 第1章&#xff1a;数学与编程基础&#xff08;4-6周&#xff09; 1.1 数学基础 线性代数&#xff08;矩阵运算、特征值分…...

lvs的DR模式

基于Linux的负载均衡集群软件 LVS 全称为Linux Virtual Server,是一款开源的四层(传输层)负载均衡软件 Nginx 支持四层和七层(应用层)负载均衡 HAProxy 和Nginx一样,也可同时支持四层和七层(应用层)负载均衡 基于Linux的高可用集群软件 Keepalived Keepalived是Linux…...

mysql读写分离与proxysql的结合

上一篇文章介绍了mysql如何设置成主从复制模式&#xff0c;而主从复制的目的&#xff0c;是为了读写分离。 读写分离&#xff0c;拿spring boot项目来说&#xff0c;可以有2种方式&#xff1a; 1&#xff09;设置2个数据源&#xff0c;读和写分开使用 2&#xff09;使用中间件…...

【C++学习篇】C++11第二期学习

目录 1. 可变参数模板 1.1 基本语法及原理 1.2 包扩展 1.3empalce系列接⼝ 2. lamba 2.1 lambda的语法表达式 2.2 捕捉列表 2.3 lamba的原理 1. 可变参数模板 1.1 基本语法及原理 1. C11⽀持可变参数模板&#xff0c;也就是说⽀持可变数量参数的函数模板和类模板&…...

TextWebSocketHandler 和 @ServerEndpoint 各自实现 WebSocket 服务器

TextWebSocketHandler 和 ServerEndpoint 都可以用于实现 WebSocket 服务器&#xff0c;但它们属于不同的技术栈&#xff0c;使用方式和功能有一些区别。以下是它们的对比&#xff1a; 1. 技术栈对比 特性TextWebSocketHandler (Spring)ServerEndpoint (Java EE/JSR-356)所属框…...

【C++高并发服务器WebServer】-18:事件处理模式与线程池

本文目录 一、事件处理模式1.1 Reactor模式1.2 Proactor模式1.3 同步IO模拟Proactor模式 二、线程池 一、事件处理模式 服务器程序通常需要处理三类事件&#xff1a;I/O事件、信号、定时事件。 对应的有两种高效的事件处理模式&#xff1a;Reactor和Proactor&#xff0c;同步…...

23种设计模式的定义和应用场景-02-结构型模式-C#代码

23种设计模式的定义和应用场景&#xff1a; 1. 创建型模式&#xff08;共5种&#xff09;&#xff1a; 单例模式&#xff08;Singleton&#xff09;、工厂方法模式&#xff08;Factory Method&#xff09;、抽象工厂模式&#xff08;Abstract Factory&#xff09;、建造者模式…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...