当前位置: 首页 > news >正文

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语言中目录操作&#xff08;创建目录、删除目录、重命名、遍历…...

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 硬件和操作系统&#xff08;Hardware and OS&#xff09; 2.1. 操作系统&#xff08;OS&#xff09; 2.2. 磁盘和文件系统&#xff08;Disks and Filesystem&#xff09; 一. 前言 Kafka 是 I/O 密集型而非计算密集型的框架&#xff0c;所以对 CP…...

Kolla-ansible部署OpenStack集群

0. OpenStack 部署 系统要求 单机部署最低配置&#xff1a; 2张网卡8G内存40G硬盘空间 主机系统&#xff1a; CentOS Stream 9Debian Bullseye (11)openEuler 22.03 LTSRocky Linux 9- Ubuntu Jammy (22.04) 官方不再支持CentOS 7作为主机系统&#xff0c;我这里使用的是R…...

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用

在地质灾害的紧急关头&#xff0c;救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时&#xff0c;倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO&#xff0c;这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机&#xff0c;以其卓越的性能和功能&#…...

MATLAB算法实战应用案例精讲-【数模应用】中介效应分析(补充篇)(附R语言和python代码实现)

目录 前言 几个高频面试题目 中介效应分析与路径分析的区别 1.中介效应分析 2.路径分析 注意事项...

Day96:云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸

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

python botos s3 aws

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

python画神经网络图

代码1(画神经网络连接图&#xff09; from math import cos, sin, atan import matplotlib.pyplot as plt # 注意这里并没有用到这个networkx这个库&#xff0c;完全是根据matploblib这个库来画的。 class Neuron():def __init__(self, x, y,radius,nameNone):self.x xself.y …...

Bash 编程精粹:从新手到高手的全面指南之逻辑控制

在 Unix 和 Linux 系统中&#xff0c;Bash&#xff08;Bourne-Again Shell&#xff09;是一种广泛使用的 shell&#xff0c;提供了强大的脚本编程能力。本文将详细介绍 Bash 脚本中的逻辑控制结构&#xff0c;包括条件判断、分支选择、循环控制以及退出控制等内容。 条件判断&…...

自动化运维(三十)Ansible 实战之自定义插件

Ansible 自定义插件允许你扩展其功能,以满足特定的自动化需求。Ansible 支持多种类型的插件开发,如动态库存、查找、回调、过滤器、变量等。这里我们将通过实例,介绍如何开发、部署和使用一个自定义插件。 开发自定义查找插件 查找插件用于在 Ansible 任务中动态获取数据。…...

实习僧网站的实习岗位信息分析

目录 背景描述数据说明数据集来源问题描述分析目标以及导入模块1. 数据导入2. 数据基本信息和基本处理3. 数据处理3.1 新建data_clean数据框3.2 数值型数据处理3.2.1 “auth_capital”&#xff08;注册资本&#xff09;3.2.2 “day_per_week”&#xff08;每周工作天数&#xf…...

C语言中局部变量和全局变量是否可以重名?为什么?

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

小程序中配置scss

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

ZYNQ-Vitis(SDK)裸机开发之(四)PS端MIO和EMIO的使用

目录 一、ZYNQ中MIO和EMIO简介 二、Vivado中搭建block design 1.配置PS端MIO&#xff1a; 2.配置PS端EMIO&#xff1a; 三、Vitis中新建工程进行GPIO控制 1. GPIO操作头文件gpio_hdl.h&#xff1a; 2.GPIO操作源文件gpio_hdl.c&#xff1a; 3.main函数进行调用 例程开发…...

聊聊jvm中内存模型的坑

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

DevOps已死?2024年的DevOps将如何发展

随着我们进入2024年&#xff0c;DevOps也发生了变化。新兴的技术、变化的需求和发展的方法正在重新定义有效实施DevOps实践。 IDC预测显示&#xff0c;未来五年&#xff0c;支持DevOps实践的产品市场继续保持健康且快速增长&#xff0c;2022年-2027年的复合年增长率&#xff0…...

appium控制手机一直从下往上滑动

用于使用Appium和Selenium WebDriver在Android设备上滚动设置应用程序的界面。具体来说&#xff0c;它通过WebDriverWait和expected_conditions等待元素出现&#xff0c;然后使用ActionChains移动到该元素并执行滚动动作。在setUp中&#xff0c;它初始化了Appium的WebDriver和c…...

为什么光伏探勘测绘需要无人机?

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

day10 | 栈与队列 part-2 (Go) | 20 有效的括号、1047 删除字符串中的所有相邻重复项、150 逆波兰表达式求值

今日任务 20 有效的括号 (题目: . - 力扣&#xff08;LeetCode&#xff09;)1047 删除字符串中的所有相邻重复项 (题目: . - 力扣&#xff08;LeetCode&#xff09;)150 逆波兰表达式求值 (题目: . - 力扣&#xff08;LeetCode&#xff09;) 20 有效的括号 题目: . - 力扣&…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

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

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)

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

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地

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