正文
go语言文件大小 go语言文件操作
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
Golang 的静态编译
Go 语言和 C 语言go语言文件大小的一个很大的区别是go语言文件大小, Go 语言只静态编译go语言文件大小,做个测试go语言文件大小:
一方面是 Go 语言编译后的可执行文件大小比 C 语言的大很多,
另一方面是 C 语言的可执行文件需要依赖 glibc 动态库,
用 ldd 命令可以看出来:
或者直接删除 glibc 动态库, C 可执行程序报错,而 Go 的还能运行:
这时候只有内部命令可以运行,外部命令,包括 ln 甚至最常用的 ls 命令也不能运行了:
设置好 LD_PRELOAD 环境变量之后, ln 命令可以运行,但是 sudo 仍然不能运行
只能靠 root 用户来重新创建软连接了:
所以用 sudo 来 rm 文件要小心,还是用 root 比较好。如果没有预先留一个打开的 root 终端,登录都登不进去。
go和rust打包软件大小
0.86MB。go和rust打包软件大小是0.86MBgo语言文件大小,go和rust的软件包是属于整套的软件包go语言文件大小,需要将go和rust软件包在windows的原文件里进行协同式解压,只有经过协同式解压之后才能进行安装使用。
怎么样通过golang获取上传文件大小的实现
前端
form enctype="multipart/form-data" method="post" action="youruri"
input type="file" name="fileA" id="fileA"
button type="submit"提交/button
/form
后端gin
type Sizer interface {
Size() int64
}
file, header, err := c.Request.FormFile("fileA")
if err != nil {
return "", err
}
fsize := file.(Sizer).Size()
if fsize FILEMAXSIZE {
return "", fmt.Errorf("文件太大")
}
go限制上传文件大小
必须在对r.Body进行操作之前之前上面的操作
其他说明:
客户端(比如axios)向服务器发起超出服务器愿意接受大小的body时,服务器即便向客户端发出了类似(413:文件太大)的响应后,客户端未必会处理该响应。原因:
Go 语言自我提升 (三次握手 - 四次挥手 - TCP状态图 - udp - 网络文件传输)
三次握手:
1. 主动发起连接请求端(客户端),发送 SYN 标志位,携带数据包、包号
2. 被动接收连接请求端(服务器),接收 SYN,回复 ACK,携带应答序列号。同时,发送SYN标志位,携带数据包、包号
3. 主动发起连接请求端(客户端),接收SYN 标志位,回复 ACK。
被动端(服务器)接收 ACK —— 标志着 三次握手建立完成( Accept()/Dial() 返回 )
四次挥手:
1. 主动请求断开连接端(客户端), 发送 FIN标志,携带数据包
2. 被动接受断开连接端(服务器), 发送 ACK标志,携带应答序列号。 —— 半关闭完成。
3. 被动接受断开连接端(服务器), 发送 FIN标志,携带数据包
4. 主动请求断开连接端(客户端), 发送 最后一个 ACK标志,携带应答序列号。—— 发送完成,客户端不会直接退出,等 2MSL时长。
等 2MSL待目的:确保服务器 收到最后一个ACK
滑动窗口:
通知对端本地存储数据的 缓冲区容量。—— write 函数在对端 缓冲区满时,有可能阻塞。
TCP状态转换:
1. 主动发起连接请求端:
CLOSED —— 发送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回发 ACK —— ESTABLISHED (数据通信)
2. 主动关闭连接请求端:
ESTABLISHED —— 发送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半关闭、主动端)
—— 接收FIN、回复ACK —— TIME_WAIT (主动端) —— 等 2MSL 时长 —— CLOSED
3. 被动建立连接请求端:
CLOSED —— LISTEN —— 接收SYN、发送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (数据通信)
4. 被动断开连接请求端:
ESTABLISHED —— 接收 FIN、发送 ACK —— CLOSE_WAIT —— 发送 FIN —— LAST_ACK —— 接收ACK —— CLOSED
windows下查看TCP状态转换:
netstat -an | findstr 端口号
Linux下查看TCP状态转换:
netstat -an | grep 端口号
TCP和UDP对比:
TCP: 面向连接的可靠的数据包传递。 针对不稳定的 网络层,完全弥补。ACK
UDP:无连接不可靠的报文传输。 针对不稳定的 网络层,完全不弥补。还原网络真实状态。
优点 缺点
TCP: 可靠、顺序、稳定 系统资源消耗大,程序实现繁复、速度慢
UDP:系统资源消耗小,程序实现简单、速度快 不可靠、无序、不稳定
使用场景:
TCP:大文件、可靠数据传输。 对数据的 稳定性、准确性、一致性要求较高的场合。
UDP:应用于对数据时效性要求较高的场合。 网络直播、电话会议、视频直播、网络游戏。
UDP-CS-Server实现流程:
1. 创建 udp地址结构 ResolveUDPAddr(“协议”, “IP:port”) —— udpAddr 本质 struct{IP、port}
2. 创建用于 数据通信的 socket ListenUDP(“协议”, udpAddr ) —— udpConn (socket)
3. 从客户端读取数据,获取对端的地址 udpConn.ReadFromUDP() —— 返回:n,clientAddr, err
4. 发送数据包给 客户端 udpConn.WriteToUDP("数据", clientAddr)
UDP-CS-Client实现流程:
1. 创建用于通信的 socket。 net.Dial("udp", "服务器IP:port") —— udpConn (socket)
2. 以后流程参见 TCP客户端实现源码。
UDPserver默认就支持并发!
------------------------------------
命令行参数: 在main函数启动时,向整个程序传参。 【重点】
语法: go run xxx.go argv1 argv2 argv3 argv4 。。。
xxx.exe: 第 0 个参数。
argv1 :第 1 个参数。
argv2 :第 2 个参数。
argv3 :第 3 个参数。
argv4 :第 4 个参数。
使用: list := os.Args 提取所有命令行参数。
获取文件属性函数:
os.stat(文件访问绝对路径) —— fileInfo 接口
fileInfo 包含 两个接口。
Name() 获取文件名。 不带访问路径
Size() 获取文件大小。
网络文件传输 —— 发送端(客户端)
1. 获取命令行参数,得到文件名(带路径)filePath list := os.Args
2. 使用 os.stat() 获取 文件名(不带路径)fileName
3. 创建 用于数据传输的 socket net.Dial("tcp", “服务器IP+port”) —— conn
4. 发送文件名(不带路径) 给接收端, conn.write()
5. 读取 接收端回发“ok”,判断无误。封装函数 sendFile(filePath, conn) 发送文件内容
6. 实现 sendFile(filePath, conn)
1) 只读打开文件 os.Open(filePath)
for {
2) 从文件中读数据 f.Read(buf)
3) 将读到的数据写到socket中 conn.write(buf[:n])
4)判断读取文件的 结尾。 io.EOF. 跳出循环
}
网络文件传输 —— 接收端(服务器)
1. 创建用于监听的 socket net.Listen() —— listener
2. 借助listener 创建用于 通信的 socket listener.Accpet() —— conn
3. 读取 conn.read() 发送端的 文件名, 保存至本地。
4. 回发 “ok”应答 发送端。
5. 封装函数,接收文件内容 recvFile(文件路径)
1) f = os.Create(带有路径的文件名)
for {
2)从 socket中读取发送端发送的 文件内容 。 conn.read(buf)
3) 将读到的数据 保存至本地文件 f.Write(buf[:n])
4) 判断 读取conn 结束, 代表文件传输完成。 n == 0 break
}
Go 读取大文件
测试文件使用的文件大小为 1.35GB 的日志文本文件,使用下面两种方式来读取。
Go 标准库中包含了读写的缓冲库,直接使用即可:
输出结果为:
Go 标准库中包括了 io 读写的相关工具包,直接开箱即用:
输出结果为:
结果对比
测试发现, ioutil.ReadFile 比 bufio 读写还要快。
关于go语言文件大小和go语言文件操作的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。