Golang基础-12
Go语言基础
介绍
目录操作
文件操作
测试
介绍
- 本文介绍Go语言中目录操作(创建目录、删除目录、重命名、遍历目录、修改权限)、文件操作(创建、打开关闭、删除、重命名、修改权限、读文件、写文件、文件定位、拷贝)、测试(单元测试、基准测试、示例)等相关知识。
目录操作
- 在计算机中,目录是组织和存储文件的一种方式,可以多层嵌套结构。
- Go语言提供标准包 os 中相关方法对目录进行操作。
创建
package mainimport ("fmt""os"
)func main() {var path string = "./test_dir"// 创建单层目录,若 path 存在一个以上不存在目录,则创建失败// 目录已经存在,创建失败err := os.Mkdir(path, 0755)if err != nil {fmt.Println("create dir failed")} else {fmt.Println("create dir succeed")}path = "./test_dir/a/b"// 创建多层目录,未知目录嵌套数量大于等于零个err = os.MkdirAll(path, 0755)if err != nil {fmt.Println("create dir failed")} else {fmt.Println("create dir succeed")}
}
删除
package mainimport ("fmt""os"
)func main() {var path string = "./test_dir"// 删除单层目录,若删除目录存在子目录,则删除失败// 删除的目录不存在时,删除失败err = os.Remove(path)if err != nil {fmt.Println("remove dir failed")} else {fmt.Println("remove dir succeed")}// 删除多层目录,不必关注目录是否存在path = "./test_dir"err = os.RemoveAll(path)if err != nil {fmt.Println("remove dir failed")} else {fmt.Println("remove dir succeed")}
}
重命名
package mainimport ("fmt""os"
)func main() {var path string = "./test_dir"err := os.Mkdir(path, 0755)if err != nil {fmt.Println("create dir failed")} else {fmt.Println("create dir succeed")}// 重新命名时,新名称已经存在时,命名失败err = os.Rename(path, "./test_dir_new")if err != nil {fmt.Println("rename dir failed")} else {fmt.Println("rename dir succeed")}
}
遍历目录
package mainimport ("fmt""os""path/filepath"
)func main() {var path string = "./../../src"// 读取 path 目录下所有目录,注意只读取单层,若 path 目录不存在读取失败dir, err := os.ReadDir(path)if err != nil {fmt.Println("read dir failed")} else {fmt.Println("read dir succeed")for _, v := range dir {fmt.Println("Name: ", v)}}// 遍历子目录下所有文件和子目录sDir := new([]os.FileInfo)err = filepath.Walk(path, func(path string, info os.FileInfo, err error) error {*sDir = append(*sDir, info)return nil})if err != nil {fmt.Println("read dir failed")} else {fmt.Println("read dir succeed")for _, v := range *sDir {fmt.Println("Name: ", v.Name())}}
}
修改权限
package mainimport ("fmt""os"
)func main() {var path string = "./test_dir"err := os.Mkdir(path, 0755)if err != nil {fmt.Println("create dir failed")} else {fmt.Println("create dir succeed")}// 0777 为八进制权限表示方式// 权限分三组:所有者(user)、组(group)和其他人(others)// 每组权限又分为读(r)、写(w)和执行(x)// 例如:rwxrw-r--(对应数组421|420|400,八进制表示0764)err = os.Chmod(path, 0777)if err != nil {fmt.Println("chmod failed")} else {fmt.Println("chmod succeed")}
}
文件操作
- 在计算机中,文件是非常重要的IO,可以存储文件或进行数据交换等,Linux系统更是"一切皆文件"。
- 在Go语言中,主要操作文件的包在 os 中。
创建
package mainimport ("fmt""os"
)func main() {var name string = "./test_dir/test_file.txt"// 创建文件,路径错误会创建失败,若不存在则创建,若存在则清空文件内容file, err := os.Create(name)if err != nil {fmt.Println("create file failed")} else {fmt.Println("create file succeed")defer file.Close()}
}
打开关闭
package mainimport ("fmt""os"
)func main() {var name string = "./test_dir/test_file.txt"// 打开文件,路径错误会打开失败,文件不存在会打开失败,返回文件指针与错误信息file, err := os.Open(name)if err != nil {fmt.Println("open file failed")} else {fmt.Println("open file succeed")// 使用 defer 延迟关闭方法调用defer file.Close()}// 通用的文件打开调用,通过标识可创建、只读、只写、追加、截断等打开文件// 第三个参数为权限,创建时使用,返回文件指针与错误信息name = "./test_dir/test_file2.txt"f, e := os.OpenFile(name, os.O_RDONLY|os.O_CREATE|os.O_APPEND, 0755)if e != nil {fmt.Println("open file failed")} else {fmt.Println("open file succeed")// 使用 defer 延迟关闭方法调用defer f.Close()}
}
删除
package mainimport ("fmt""os"
)func main() {name := "./test_dir/test_file2.txt"// 删除文件,文件不存在或路径错误删除失败err = os.Remove(name)if err != nil {fmt.Println("remove file failed")} else {fmt.Println("remove file succeed")}// 删除文件,不必判断文件是否存在或路径是否正确err = os.RemoveAll(name)if err != nil {fmt.Println("remove file failed")} else {fmt.Println("remove file succeed")}
}
重命名
package mainimport ("fmt""os"
)func main() {var name string = "./test_dir/test_file.txt"// 文件重命名,路径错误或对应目录下新文件名已经存在,重命名失败err := os.Rename(name, "./test_dir/test_file2.txt")if err != nil {fmt.Println("rename file failed")} else {fmt.Println("rename file succeed")}
}
修改权限
package mainimport ("fmt""os"
)func main() {var name string = "./test_dir/test_file2.txt"// 文件访问权限修改err := os.Chmod(name, 0744)if err != nil {fmt.Println("chmod failed")} else {fmt.Println("chmod succeed")}
}
读文件
package mainimport ("fmt""io""os"
)func main() {//读取文件file, err := os.OpenFile("./test_dir/test_file2.txt", os.O_RDONLY, 0755)if err != nil {fmt.Println("open file failed", err)return}defer file.Close() //main 函数结束前执行文件资源释放fmt.Println("open file succeed")// 方式一:打开文件读取//定义参数切片var arr [1024]byte = [1024]byte{0}result := arr[:]n, err := file.Read(result) //以切片的形式读取//读取过程中出现异常if err != nil && err != io.EOF {fmt.Println("read file failed", err)return}fmt.Printf("byte size: %d\n", n)fmt.Printf("file content: %s\n", string(result[0:n]))for {n, err = file.Read(result) //以切片的形式读取//读取过程中出现异常if err == io.EOF || n == 0 {break}if err != nil {fmt.Println("read file failed", err)return}fmt.Printf("byte size: %d\n", n)fmt.Printf("file content: %s\n", string(result[0:n]))}// 文件判断读取是否完成fmt.Println("read file over", err)// 方式二:使用 bufio 读取// 创建 bufio 缓冲区读取reader := bufio.NewReader(file)/*for { //循环读取内存,输出到程序中str, err := reader.ReadString('\n') //按行读取if err == io.EOF {fmt.Print(str)return}if err != nil {fmt.Println("文件读取异常", err)return}fmt.Print(str)}*/
}
写文件
package mainimport ("bufio""fmt""os"
)func main() {// 打开文件,以追加方式写入file, err := os.OpenFile("./test_dir/test_file2.txt", os.O_WRONLY|os.O_APPEND, 0755)if err != nil {fmt.Println("open file failed", err)return}defer file.Close() //main 函数结束前执行文件资源释放fmt.Println("open file succeed")// 方式一:直接追加数据// 字节切片写入file.Write([]byte("write file data, slice\n"))// 字符串写入str := "string write"file.WriteString(str)// 方式一:使用 bufio 追加数据// 文件写入缓冲区w := bufio.NewWriter(file)//内容写入缓冲区w.WriteString("\nbufio write data\n")//缓冲区数据刷新w.Flush()
}
文件定位
package mainimport ("fmt""io""os"
)func main() {// 打开文件,默认文件指针偏移量为0,即在文件起始位置file, err := os.OpenFile("./test_dir/test_file2.txt", os.O_RDONLY, 0755)if err != nil {fmt.Println("open file failed", err)return}defer file.Close() //main 函数结束前执行文件资源释放fmt.Println("open file succeed")// 此时读取文件字节数,文件实际数据不超过1000字节//定义参数切片var arr [1024]byte = [1024]byte{0}result := arr[:]n, err := file.Read(result) //以切片的形式读取//读取过程中出现异常if err != nil && err != io.EOF {fmt.Println("read file failed", err)return}fmt.Printf("byte size: %d\n", n)// 以上操作读完文件后,文件指针已经指向文件末尾,此时不可能继续读取文件内容// 将文件指针移动到文件起始位置// os.SEEK_CUR, os.SEEK_CUR is deprecatedoff, e := file.Seek(0, io.SeekStart) // 相对于起始位置偏移值if e != nil {fmt.Println("seek filed")return}fmt.Println("off: ", off)n, err = file.Read(result) //以切片的形式读取//读取过程中出现异常if err != nil && err != io.EOF {fmt.Println("read file failed", err)return}fmt.Printf("byte size: %d\n", n)
}
拷贝
// 调用 Copy 方法实现文件复制
package mainimport ("io""os"
)// 文件复制函数
func CopyFile(src, dst string) (err error) {in, err := os.OpenFile(src, os.O_RDONLY, 0744)if err != nil {return}defer in.Close()// 文件不存在就创建out, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, 0754)if err != nil {return}defer out.Close()_, err = io.Copy(out, in)return
}func main() {src := "./test_dir/test_file2.txt"dst := "./test_dir/test_file.txt"err := CopyFile(src, dst)if err != nil {panic(err)}
}
单元测试
- 软件开发重要环节之一就是对所写代码进行测试,编写测试用例能确保一些问题能在此阶段发现并修改。
- Go语言中的测试依赖 go test 命令在包目录内,格式以 *_test.go 为后缀名的源代码文件都是 go test 测试的一部分。
- 在 *_test.go 文件中有三种类型的函数,单元测试函数、基准测试函数 和示例函数。
类型 | 格式 | 备注 |
---|---|---|
单元测试 | 前缀为Test | 测试逻辑 |
基准测试 | 前缀为Benchmark | 测试性能 |
示 例 | 前缀为Example | 提供示例 |
- 用来测试的代码必须以 _test.go 结尾。
- 单元测试的函数名必须以 Test 开头,只有一个参数,类型是 *testing.T。
- 单元测试函数名 Test 后,被测函数名首字母必须大写。
- 更多功能请参照官方文档:包testing。
单元测试
// pkgtest.go 源文件
package pkgtestfunc Add[T int | float32](a, b T) T {return a + b
}func sub[T int | float32](a, b T) T {return a - b
}// pkgtest_test.go 源文件
package pkgtestimport "testing"// Test开头,函数名首字母大写
package pkgtestimport "testing"func TestAdd(t *testing.T) {var a, b int = 10, 20if 31 != Add(a, b) {t.Error("Test failed")return}t.Log("Test succeed")
}func TestSub(t *testing.T) {var a, b int = 10, 20if 31 != sub(a, b) {t.Error("Test failed")return}t.Log("Test succeed")
}// 在终端运行指令 go test -v 输出测试结果
// 在终端运行指令 go test -cover -run -coverprofile='.\c.out' -coverpkg=pkgtest 输出覆盖测试结果
// 在终端运行指令 go tool cover -html='.\c.out' -o coverage.html 将结果转换为网页形式打开
基准测试
- 基准测试或压力测试必须以 Benchmark 开头,并且只有参数 *testing.B。
func BenchmarkAdd(b *testing.B) {var a, c int = 10, 20for i := 0; i < 100; i++ {Add(a, c)}
}// 在终端运行指令 go test -run "none" -bench . -benchmem 执行基准测试
示例
func ExampleAdd() {var a, c int = 10, 20fmt.Println("a + c = ", a+c)
}
起始
相关文章:
Golang基础-12
Go语言基础 介绍 目录操作 创建 删除 重命名 遍历目录 修改权限 文件操作 创建 打开关闭 删除 重命名 修改权限 读文件 写文件 文件定位 拷贝 测试 单元测试 基准测试 示例 介绍 本文介绍Go语言中目录操作(创建目录、删除目录、重命名、遍历…...
python递归统计文件夹下pdf文件的数量
python递归统计文件夹下pdf文件的数量 import os from docx import Documentdef count_all_pages(root_dir):total_pages 0# 遍历文件夹for dirpath, dirnames, filenames in os.walk(root_dir):for filename in filenames:# if filename.endswith(.docx) or filename.endswit…...
Kafka 硬件和操作系统
目录 一. 前言 二. Kafka 硬件和操作系统(Hardware and OS) 2.1. 操作系统(OS) 2.2. 磁盘和文件系统(Disks and Filesystem) 一. 前言 Kafka 是 I/O 密集型而非计算密集型的框架,所以对 CP…...
Kolla-ansible部署OpenStack集群
0. OpenStack 部署 系统要求 单机部署最低配置: 2张网卡8G内存40G硬盘空间 主机系统: CentOS Stream 9Debian Bullseye (11)openEuler 22.03 LTSRocky Linux 9- Ubuntu Jammy (22.04) 官方不再支持CentOS 7作为主机系统,我这里使用的是R…...

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用
在地质灾害的紧急关头,救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时,倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO,这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机,以其卓越的性能和功能&#…...
MATLAB算法实战应用案例精讲-【数模应用】中介效应分析(补充篇)(附R语言和python代码实现)
目录 前言 几个高频面试题目 中介效应分析与路径分析的区别 1.中介效应分析 2.路径分析 注意事项...

Day96:云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸
目录 云原生-Docker安全-容器逃逸&系统内核漏洞 云原生-Docker安全-容器逃逸&docker版本漏洞 CVE-2019-5736 runC容器逃逸(需要管理员配合触发) CVE-2020-15257 containerd逃逸(启动容器时有前提参数) 云原生-Docker安全-容器逃逸&CDK自动化 知识点࿱…...

python botos s3 aws
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html AWS是亚马逊的云服务,其提供了非常丰富的套件,以及支持多种语言的SDK/API。本文针对其S3云储存服务的Python SDK(boto3)的使用进行介绍。 …...

python画神经网络图
代码1(画神经网络连接图) from math import cos, sin, atan import matplotlib.pyplot as plt # 注意这里并没有用到这个networkx这个库,完全是根据matploblib这个库来画的。 class Neuron():def __init__(self, x, y,radius,nameNone):self.x xself.y …...
Bash 编程精粹:从新手到高手的全面指南之逻辑控制
在 Unix 和 Linux 系统中,Bash(Bourne-Again Shell)是一种广泛使用的 shell,提供了强大的脚本编程能力。本文将详细介绍 Bash 脚本中的逻辑控制结构,包括条件判断、分支选择、循环控制以及退出控制等内容。 条件判断&…...
自动化运维(三十)Ansible 实战之自定义插件
Ansible 自定义插件允许你扩展其功能,以满足特定的自动化需求。Ansible 支持多种类型的插件开发,如动态库存、查找、回调、过滤器、变量等。这里我们将通过实例,介绍如何开发、部署和使用一个自定义插件。 开发自定义查找插件 查找插件用于在 Ansible 任务中动态获取数据。…...

实习僧网站的实习岗位信息分析
目录 背景描述数据说明数据集来源问题描述分析目标以及导入模块1. 数据导入2. 数据基本信息和基本处理3. 数据处理3.1 新建data_clean数据框3.2 数值型数据处理3.2.1 “auth_capital”(注册资本)3.2.2 “day_per_week”(每周工作天数…...

C语言中局部变量和全局变量是否可以重名?为什么?
可以重名 在C语言中, 局部变量指的是定义在函数内的变量, 全局变量指的是定义在函数外的变量 他们在程序中的使用方法是不同的, 当重名时, 局部变量在其所在的作用域内具有更高的优先级, 会覆盖或者说隐藏同名的全局变量 具体来说: 局部变量的生命周期只在函数内部,如果出了…...

小程序中配置scss
找到:project.config.json 文件 setting 模块下添加: "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后,重启开发工具,并新建文件 结果:...

ZYNQ-Vitis(SDK)裸机开发之(四)PS端MIO和EMIO的使用
目录 一、ZYNQ中MIO和EMIO简介 二、Vivado中搭建block design 1.配置PS端MIO: 2.配置PS端EMIO: 三、Vitis中新建工程进行GPIO控制 1. GPIO操作头文件gpio_hdl.h: 2.GPIO操作源文件gpio_hdl.c: 3.main函数进行调用 例程开发…...

聊聊jvm中内存模型的坑
jvm线程的内存模型 看图,简单来说线程中操作的变量是副本。在并发情况下,如果数据发生变更,副本的数据就变为脏数据。这个时候就会有并发问题。 参考:https://www.cnblogs.com/yeyang/p/12580682.html 怎么解决并发问题 解决的…...

DevOps已死?2024年的DevOps将如何发展
随着我们进入2024年,DevOps也发生了变化。新兴的技术、变化的需求和发展的方法正在重新定义有效实施DevOps实践。 IDC预测显示,未来五年,支持DevOps实践的产品市场继续保持健康且快速增长,2022年-2027年的复合年增长率࿰…...
appium控制手机一直从下往上滑动
用于使用Appium和Selenium WebDriver在Android设备上滚动设置应用程序的界面。具体来说,它通过WebDriverWait和expected_conditions等待元素出现,然后使用ActionChains移动到该元素并执行滚动动作。在setUp中,它初始化了Appium的WebDriver和c…...

为什么光伏探勘测绘需要无人机?
随着全球对可再生能源需求的不断增长,光伏产业也迎来了快速发展的机遇。光伏电站作为太阳能发电的主要形式之一,其建设前期的探勘测绘工作至关重要。在这一过程中,无人机技术的应用正逐渐展现出其独特的优势。那么,为什么光伏探勘…...

day10 | 栈与队列 part-2 (Go) | 20 有效的括号、1047 删除字符串中的所有相邻重复项、150 逆波兰表达式求值
今日任务 20 有效的括号 (题目: . - 力扣(LeetCode))1047 删除字符串中的所有相邻重复项 (题目: . - 力扣(LeetCode))150 逆波兰表达式求值 (题目: . - 力扣(LeetCode)) 20 有效的括号 题目: . - 力扣&…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...