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 有效的括号 题目: . - 力扣&…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地
NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配,成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景,通过标准化 SQL 工作台与细粒度权限管控两大能力,助力企业安全高效…...