Go for循环中的defer

这篇具有很好参考价值的文章主要介绍了Go for循环中的defer。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

写个后台程序,定时抓取服务器指标,代码逻辑如下,使用一段时间后内存不断增加

func CollectInfo() {
	for {
		// 获取服务器信息代码
		// ...............
		resp, err := http.Post("http://server", "application/json", strings.NewReader(`{"info1": "xxxx", "info2": "yyyy"}`))
		if err != nil {
			// 错误处理
		}
		defer resp.Body.Close()
		// 处理其他逻辑
		time.Sleep(time.Minute)
	}
}

排查

一开始感觉是哪里文件或者网络忘记Close了,看下进程打开的文件.
如下图类似情况, 看到很多http ESTABLISHED状态,估计就是哪个http忘记Close.
排查代码,问题应该出现在上面一段代码,for循环中defer不会执行,在函数返回时执行

# 查看进程打开的文件
lsof -p `pgrep defer`

Go for循环中的defer,golang,开发语言,后端

验证

写个例子测试一下

package main

import (
	"log"
	"time"
)

func main() {
	log.Println("program started")
	for i := 0; i < 3; i++ {
		defer func(i int) {
			log.Println("defer executed: ", i)
		}(i)
	}
	time.Sleep(time.Minute)
	log.Println("program exited")
}

根据打印的时间,可以得出以下两条结论

  • defer只在函数返回时才执行
  • defer执行顺序是先进后出,先调用的后执行

Go for循环中的defer,golang,开发语言,后端

优化

写defer写习惯了,这里不能用defer, 用完直接调用关闭文章来源地址https://www.toymoban.com/news/detail-704292.html

func CollectInfo() {
	for {
		// 获取服务器信息代码
		// ...............
		resp, err := http.Post("http://server", "application/json", strings.NewReader(`{"info1": "xxxx", "info2": "yyyy"}`))
		if err != nil {
			// 错误处理
		} else{
			resp.Body.Close()
		}
		// 处理其他逻辑
		time.Sleep(time.Minute)
	}
}

到了这里,关于Go for循环中的defer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【30天熟悉Go语言】8 Go流程控制之循环结构for range、goto、break、continue

    Go系列文章: GO开篇:手握Java走进Golang的世界 2 Go开发环境搭建、Hello World程序运行 3 Go编程规约和API包 4 Go的变量、常量、运算符 5 Go 基本数据类型 6 Go 复杂数据类型之指针 7 Go流程控制之分支结构if、switch Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html for 循环是一

    2024年02月10日
    浏览(47)
  • go语言基础 -- defer及其用法

    在go语言中,程序员创建的资源如文件句柄、数据库连接、锁等,需要在函数执行完毕后释放,因此go提供了defer的机制,在函数退出时去释放defer指定的资源,这样我们在一些资源申请的时候,可以先defer 声明释放语句,无需担心后续忘记释放资源。defer利用了栈,先声明的d

    2024年02月04日
    浏览(42)
  • Go 语言中 defer 使用时有哪些陷阱?

    大家好,我是 frank ,「 Golang 语言开发栈」公众号作者。 01 介绍 defer 的使用方式是在其后紧跟一个函数调用或方法调用,确保在其所在的函数体返回之前执行其调用的函数或方法。 在 Go 语言中,defer 一般用于资源释放,或使用 defer 调用一个匿名函数,在匿名函数中使用

    2024年01月21日
    浏览(35)
  • Go语言之函数补充defer语句,递归函数,章节练习

    defer语句是go语言提供的一种用于注册延迟调用的机制,是go语言中一种很有用的特性。 defer语句注册了一个函数调用,这个调用会延迟到defer语句所在的函数执行完毕后执行,所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句或函数所在协程发生了恐慌

    2024年02月17日
    浏览(50)
  • 【Golang】go编程语言适合哪些项目开发?

    前言 在当今数字化时代,软件开发已成为各行各业的核心需求之一。 而选择适合的编程语言对于项目的成功开发至关重要。 本文将重点探讨Go编程语言适合哪些项目开发,以帮助读者在选择合适的编程语言时做出明智的决策。 Go 编程语言适合哪些项目开发? Go是由Google开发

    2024年02月04日
    浏览(80)
  • 【C语言趣味教程】(12) 循环语句Ⅱ:for 循环 | for 循环的嵌套 | for 的省略 | 死循环 for(;;) | 左闭右开写法 | for 语句中的 break 和 continue

        🔗 《C语言趣味教程》👈 猛戳订阅!!! 0x00 引入:什么是 for 循环? for 循环 (For cycle) 是 C 语言中的一种循环语句,用于重复执行一段相同的或者类似的代码逻辑。 for 循环的为 for ,后面跟着括号,括号中有 3 个表达式,每个表达式用 ; 区隔开来: 📚 这 \\\"三

    2024年02月03日
    浏览(74)
  • 深入解析 C 语言中的 for 循环、break 和 continue

    当您确切地知道要循环执行代码块的次数时,可以使用  for  循环而不是  while  循环 语句 1 在执行代码块之前执行(一次)。 语句 2 定义执行代码块的条件。 语句 3 在执行代码块后执行(每次)。 下面的示例将打印数字 0 到 4: 示例 示例解释 语句 1 在循环开始之前设置

    2024年02月04日
    浏览(38)
  • 《Go语言在微服务中的崛起:为什么Go是下一个后端之星?》

    🌷🍁 博主猫头虎🐅🐾 带您进入 Golang 语言的新世界✨✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通

    2024年02月09日
    浏览(83)
  • 100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包