golang _下划线占位符代替需要释放的资源的问题
golang中_有两种作用,一种用在import中,比如这样
import _ "github.com/go-sql-driver/mysql"
表示并不需要导入整个包,只是执行这个包里面所有的init函数。另一个作用就是作为变量的占位符,比如req, _ := http.NewRequest(....),这里http.NewRequest返回的是两个参数,但是如果我并不需要用到error参数时,就可以用_线代替。
但是这里就有一种特殊情况了,例如,response, err := Client.Do(req),这种场景还是比较常见的,就是发起一个http请求时,当我不关心response时,是否可以用_代替而不接收这个参数呢?
答案是不可以的。因为这里发起http请求时,已经打开了一个tcp连接,如果不显式的调用 response.Body.Close()的话,是不会自动断开tcp连接的,尽管golang的gc已经完成了内存的回收,但是仍然不会关闭tcp连接。下面测试过程:这里测试请求了baidu,然后用_代替response参数,用tcpdump进行抓包
代码如下:
package main import (
log "ad-service/alog"
"net/http"
"strings"
"time"
) func send() {
req, err := http.NewRequest("GET", "http://baidu.com", strings.NewReader(""))
if err != nil {
log.Error(err)
return
}
client := http.Client{}
_, err := client.Do(req)
//resp, err := client.Do(req) // 不调用Close
if err != nil {
log.Error(err)
return
}
//defer resp.Body.Close() // 不调用Close
} func main() {
send()
time.Sleep( * time.Second) // 保持进程一直运行,当进程停止时会被操作系统强行回收资源
}
抓包结果:

可以看到请求结束之后30秒依然没有发送FIN包来断开连接。这个时候我手动Ctrl+C终止进程后:

正常进行了四次挥手。打开了文件都要关闭大家都知道,但是这里特殊的地方在于golang中使用_下划线并不是靠谱的。
golang _下划线占位符代替需要释放的资源的问题的更多相关文章
- Scala中_(下划线)的常见用法
Scala中_(下划线)的常见用法 地址:https://www.jianshu.com/p/0497583ec538
- _ 下划线 vue mixins 混入 变量前有下划线 变量不起作用
_ 下划线 vue mixins 混入 变量前有下划线 变量不起作用
- fastjson简单使用demo,@JSONField注解属性字段上与set、get方法上。实体类toString(),实体类转json的区别;_下划线-减号大小写智能匹配
一.demo代码 @JSONField注解属性字段上与set.get方法上.使用@Data注解(lombok插件安装最下方),对属性“笔名”[pseudonym]手动重写setter/getter方法 ...
- python实现将字符串中以大写字母开头的单词前面添加“_”下划线
在工作中写测试用例代码生成的时候,函数命令考虑采用参数文件的名称来命名,但是发现文件命名是驼峰的写写法,所以想按照字符串中的大写字母做分割,每个单词前面添加下划线,主要考虑采用正则的模式来匹配,替换然 ...
- Golang之fmt格式“占位符”
golang的fmt包实现了格式化I/O函数: package main import "fmt" type Human struct { Name string } func m ...
- golang中fmt的'占位符'使用
golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. # 定义示例类型和变量 type Human struct { Name string } var peo ...
- golang中 "下划线" 的用法
1.忽略返回值 这个应该是最简单的用途,比如某个函数返回三个参数,但是我们只需要其中的两个,另外一个参数可以忽略,这样的话代码可以这样写: v1, v2, _ := function(...) 2.用 ...
- Scala _ 下划线
1.引入包中的全部方法 import math._ //引入包中所有方法,与java中的*类似 2.表示集合元素 val a = (1 to 10).filter(_%2==0).map(_*2) / ...
- _ 下划线 Underscores __init__
Underscores in Python https://shahriar.svbtle.com/underscores-in-python Underscores in Python This p ...
随机推荐
- clamwin + 拖拽查毒+右键查毒
下载 clamwin 到 windows 并安装 http://www.clamwin.com/ 为了方便使用clamwin,写一个bat,实现拖拽到bat 自动查毒 @echo off mode c ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.2更新
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- go学习笔记(一)
- Host Only、NAT和Bridge三种网络连接
Host Only.NAT和Bridge三种网络连接 在安装好了Linux镜像之后,如何连接物理机和虚拟机呢?这就需要网络连接,网络连接有三种:HostOnly.NAT.Bridge,它们都可用于Gu ...
- Linux ISCSI服务配置
Linux ISCSI服务配置,客户端进行访问 环境配置: server端 172.25.0.11 client端 172.25.0.10 配置ISCSI服务端 1.安装软件包 yum install ...
- easyui datagrid 表头固定(垂直滚动条)、列固定(水平滚动条)
easyui datagrid 表头固定(垂直滚动条).列固定(水平滚动条),每页显示1000行 最近用多了easyui 之后还是觉得它的功能还是很强大的.它原有的功能就已经能够满足90%以上的界面需 ...
- numpy科学计算库的基础用法,完美抽象多维数组(原创)
#起别名避免重名 import numpy as np #小技巧:print从外往内看==shape从左往右看 if __name__ == "__main__": print(' ...
- 软工+C(11): 从命令行开始逐步培养编程能力(Java)
上一篇:助教指南,持续更新... // Version: 0.0.4 许多人,所不知道的是,每一种编程语言都有其对应的单元测试框架,对程序在不同阶段的测试环节也概念模糊.在实际动手编写程序许久之后才听 ...
- 转:eclipse 设置Java快捷键补全
1.打开Eclipse,点击" Window - Preferences"; 2. 在目录树上选择"Java——Editor——Content Assist", ...
- C#技巧记录——持续更新
作为一名非主修C#的程序员,在此记录下学习与工作中C#的有用内容,持续更新 对类型进行约束,class指定了类型必须是引用类型,new()指定了类型必须具有一个无参的构造函数 where T : cl ...