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

news2025/2/15 18:59:43

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 main

import "fmt"

/**
 * 闭包
 * 一个函数和与其相关的引用环境组合而成的实体
 */
func adder() func(int) int {
	sum := 0
	// 返回一个函数,函数引用了sum变量
	return func(x int) int {
		// 函数引用了sum变量
		sum += x
		return 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 0
		1 -2
		3 -6
		6 -12
		10 -20
		15 -30
		21 -42
		28 -56
		36 -72
		45 -90
	*/
}

2. 类型(type)

2.1 自定义类型

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

2.2 类型示例

package main

import "fmt"

// 自定义一个函数类型,类型名:addFun
type addFun func(int) int

// 自定义一个int类型,类型名:selfint
type selfint int

func 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 = 25
	fmt.Println(eg(15))
	var num1 selfint = 10
	var 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 main

import "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 main

import "fmt"

func main() {
	// 定义一个延时函数并执行
	defer func() {
		// 延时函数,等待主线程执行结束,捕获panic
		if r := recover(); r != nil {
			// 打印panic信息
			fmt.Println("Recovered from", r)
		}
	}()
	// 执行语句 Starting the program
	fmt.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学习历程【第八篇 指针、结构体】 待续中。。。

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

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

相关文章

基于SSM+uniapp的数学辅导小程序+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、普通用户功能模块&#xff1a;用户管理、学习中心、知识分类管理、学习周报管理、口算练习管理、试题管理、考试管理、错题本等技术选型&#xff1a;SSM&#xff0c;Vue&#xff08;后端管理web&#xff09;&#xff0c;uniapp等测试环…

利用AI智能体创建云端文档知识库并集成第三方数据源(上)

许多开发者在管理和集成多种云端的数据源时经常面对各种各样的困难&#xff0c;所以希望能够构建一个聊天机器人来协调这些数据源&#xff0c;针对业务问题并提供全面的答案。本文介绍了一种解决方案&#xff0c;帮助大家开发一个能够从文档和数据库中回答查询的聊天机器人&…

聚铭网络入围2025年度江苏省政府采购信息安全设备协议供货名单

近日&#xff0c;2025年度江苏省党政机关、事业单位及团体组织信息安全设备框架协议采购项目入围结果公布。聚铭网络凭借自身专业实力和技术优势脱颖而出&#xff0c;成功入围22个分包。 此次采购项目是江苏省政府采购领域级别最高、覆盖面最广的项目之一。从资格评选到后期材料…

vue+springboot+webtrc+websocket实现双人音视频通话会议

前言 最近一些时间我有研究&#xff0c;如何实现一个视频会议功能&#xff0c;但是找了好多资料都不太理想&#xff0c;最终参考了一个文章 WebRTC实现双端音视频聊天&#xff08;Vue3 SpringBoot&#xff09; 只不过&#xff0c;它的实现效果里面只会播放本地的mp4视频文件&…

堡垒机调用xshell 无反应

安装sso_client 确认db_path.ini xhsell路径 如图调整为本机安装的路径即可。 实战问题&#xff1a; 操作完成之后 Chrome还是无法调用&#xff0c;使用360浏览器没问题。

python后端调用Deep Seek API

python后端调用Deep Seek API 需要依次下载 ●Ollama ●Deepseek R1 LLM模型 ●嵌入模型nomic-embed-text / bge-m3 ●AnythingLLM 参考教程&#xff1a; Deepseek R1打造本地化RAG知识库:安装部署使用详细教程 手把手教你&#xff1a;deepseek R1基于 AnythingLLM API 调用本地…

Easy系列PLC 线性变换功能块(模拟量相关功能块汇总)

线性转换函数S_RTR 线性转换函数S_RTR(SCL和ST代码)_线性函数的scl语言如何编写-CSDN博客文章浏览阅读440次。博客介绍了线性转换函数S_RTR,包括其在PLC中的应用,如何与工艺PID组合使用,以及在张力开环控制中的具体实践。还提到了函数的C99兼容性,并提供了S_RTR的功能块源…

【VB语言】EXCEL中VB宏的应用

【VB语言】EXCEL中VB宏的应用 文章目录 [TOC](文章目录) 前言一、EXCEL-VB1.实验过程2.代码 二、EXCEL-VB 生成.c.h文件1.实验过程2.代码 四、参考资料总结 前言 1.WPS-VB扩展包 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、EXCEL-VB 1.实验过…

【人工智能】如何选择合适的大语言模型,是能否提高工作效率的关键!!!

DeepSeek R1入门指南 导读一、提示语差异1.1 指令侧重点不同1.2 语言风格差异1.3 知识运用引导不同 二、挑选原则2.1 模型选择2.2 提示语设计2.3 避免误区 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在前面的内容中&#xff0c…

Unity使用反射进行Protobuf(CS/SC)协议,json格式

protobuf生成的协议,有挺多协议的.利用反射生成dto进行伪协议的响应 和 发送请求 应用场景: 请求(CS)_后端先写完了,前端还搞完时,可使用此请求,可自测 响应(SC)_可自行构建一个响应,对数据进行测试 // 请求 使用物品 CS message ReqUseItem{optional Opcodes MessageID1[def…

初学 mybatis

前言 回顾之前 不使用 mybatis 框架&#xff0c;我们是怎么通过Java 操作数据库的 "jdbc" 前提&#xff1a;使用maven 构建的项目 1 添加 关于jdbc 的依赖&#xff0c;以及辅助操作数据库的 commons-dubli jar包 截取 前后端项目 2 添加配置文件里面内容有&…

C语言进阶习题(4结构体)【1】通讯录的实现

目录 1.使用结构体实现通讯录功能2.思路3. 代码实现3.1 test.c3.2 contact.c3.3 contact.h 1.使用结构体实现通讯录功能 主要功能有&#xff1a;显示通讯录信息&#xff0c;增加通讯录中人的信息&#xff0c;删除通讯录中人的信息&#xff0c;查找通信录中信息&#xff0c;修改…

释放你的元数据:使用 Elasticsearch 的自查询检索器

作者&#xff1a;来自 Elastic Josh Asres 了解如何使用 Elasticsearch 的 “self-quering” 检索器来通过结构化过滤器提高语义搜索的相关性。 在人工智能搜索的世界中&#xff0c;在海量的数据集中高效地找到正确的数据至关重要。传统的基于关键词的搜索在处理涉及自然语言的…

1.14学习总结

日常刷题单 刷了题目后&#xff0c;对于排序方法更加熟练&#xff0c;手搓代码的速度也得到了提高。 感觉字符串还不熟练&#xff0c;高精度更是云里雾里&#xff0c;上升空间极大。 同时看见今晚有个入门难度的测试&#xff0c;去练了练手&#xff0c;想看看自己是什么成分&…

【Prometheus】prometheus黑盒监控balckbox全面解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

游戏引擎学习第101天

回顾当前情况 昨天的进度基本上完成了所有内容&#xff0c;但我们还没有进行调试。虽然我们在运行时做的事情大致上是对的&#xff0c;但还是存在一些可能或者确定的bug。正如昨天最后提到的&#xff0c;既然现在时间晚了&#xff0c;就不太适合开始调试&#xff0c;所以今天我…

海康摄像头IPV6模式,手动,自动,路由公告

海康摄像头DS-2DC7220IW-A 网络设置中的IPv6配置选项。IPv6是互联网协议&#xff08;IP&#xff09;的第六版&#xff0c;用于替代IPv4&#xff0c;提供更多的IP地址和改进的网络功能。图片中的选项允许用户选择如何配置设备的IPv6网络连接&#xff1a; 手动&#xff1a;用户可…

架构设计系列(二):CI/CD

一、概述 CI/CD 是 持续集成&#xff08;Continuous Integration&#xff09; 和 持续交付/持续部署&#xff08;Continuous Delivery/Continuous Deployment&#xff09; 的缩写&#xff0c;是现代软件开发中的一套核心实践和工具链&#xff0c;旨在提高软件交付的效率、质量…

DDoS技术解析

这里是Themberfue 今天我们不聊别的&#xff0c;我们聊聊著名的网络攻击手段之一的 DDoS&#xff0c;看看其背后的技术细节。 DoS 了解 DDoS 前&#xff0c;先来讲讲 DoS 是什么&#xff0c;此 DoS 而不是 DOS 操作系统啊。1996年9月6日&#xff0c;世界第三古老的网络服务提供…

28 在可以控制 postgres 服务器, 不知道任何用户名的情况下怎 进入 postgres 服务器

前言 最近有这样的一个需求, 有一个 postgres 服务器 但是 不知道 他的任何的用户名密码, 但是我想要查询这台 postgres 服务器 然后 基于这个需求, 我们看一下 怎么来处理 pg_hba.conf 认证方式修改为 trust 首先将 postgres 服务器的认证方式修改为 trust 这时候 …