golang的filepath包的几个函数的细微区别

简介: Clean(),Dir(),ABS()配合Walk()使用的时候,由于前三个函数返回值的细微差别,会造成遍历目录的时候,得到的结果不一样.filepath.Abs("./myDoc")//返回所给路径的绝对路径这时候遍历没有问题,2019/06/12 10:50:31 监控 : 1, D:\wo...

Clean(),Dir(),ABS()配合Walk()使用的时候,由于前三个函数返回值的细微差别,会造成遍历目录的时候,得到的结果不一样.
filepath.Abs("./myDoc")
//返回所给路径的绝对路径
这时候遍历没有问题,

2019/06/12 10:50:31 监控 : 1, D:\workspace\go-wikitten\src\myDoc
2019/06/12 10:50:31 文件 : 2, myDoc\.gitkeep
2019/06/12 10:50:31 文件 : 3, myDoc\Sample HTML document.html
2019/06/12 10:50:31 文件 : 4, myDoc\Sample Markdown document.md
2019/06/12 10:50:31 监控 : 5, D:\workspace\go-wikitten\src\myDoc\code snippets (expand me!)
2019/06/12 10:50:31 文件 : 6, myDoc\code snippets (expand me!)\Bash.sh
2019/06/12 10:50:31 文件 : 7, myDoc\code snippets (expand me!)\CSS.css
2019/06/12 10:50:31 文件 : 8, myDoc\code snippets (expand me!)\JavaScript.js
2019/06/12 10:50:31 文件 : 9, myDoc\code snippets (expand me!)\PHP.php
2019/06/12 10:50:31 文件 : 10, myDoc\code snippets (expand me!)\Python.py
2019/06/12 10:50:31 文件 : 11, myDoc\code snippets (expand me!)\Ruby.rb
2019/06/12 10:50:31 文件 : 12, myDoc\code snippets (expand me!)\SQL.sql
2019/06/12 10:50:31 文件 : 13, myDoc\code snippets (expand me!)\Scheme.scm
2019/06/12 10:50:31 文件 : 14, myDoc\code snippets (expand me!)\XML.xml
2019/06/12 10:50:31 文件 : 15, myDoc\index.md
2019/06/12 10:50:31 监控 : 16, D:\workspace\go-wikitten\src\myDoc\you can also
2019/06/12 10:50:31 监控 : 17, D:\workspace\go-wikitten\src\myDoc\you can also\nest directories
2019/06/12 10:50:31 文件 : 18, myDoc\you can also\nest directories\binary files are OK too.jpg

path.Clean("./myDoc"));
//返回等价的最短路径
//1.用一个斜线替换多个斜线
//2.清除当前路径.
//3.清除内部的..和他前面的元素
//4.以/..开头的,变成/
由于我的目录不存在1,3,4的情况,所以遍历也是符合我的期望,只是把绝对路径换成了相对路径

2019/06/12 10:56:18 监控 : 1, myDoc
2019/06/12 10:56:18 文件 : 2, myDoc\.gitkeep
2019/06/12 10:56:18 文件 : 3, myDoc\Sample HTML document.html
2019/06/12 10:56:18 文件 : 4, myDoc\Sample Markdown document.md
2019/06/12 10:56:18 监控 : 5, myDoc\code snippets (expand me!)
2019/06/12 10:56:18 文件 : 6, myDoc\code snippets (expand me!)\Bash.sh
2019/06/12 10:56:18 文件 : 7, myDoc\code snippets (expand me!)\CSS.css
2019/06/12 10:56:18 文件 : 8, myDoc\code snippets (expand me!)\JavaScript.js
2019/06/12 10:56:18 文件 : 9, myDoc\code snippets (expand me!)\PHP.php
2019/06/12 10:56:18 文件 : 10, myDoc\code snippets (expand me!)\Python.py
2019/06/12 10:56:18 文件 : 11, myDoc\code snippets (expand me!)\Ruby.rb
2019/06/12 10:56:18 文件 : 12, myDoc\code snippets (expand me!)\SQL.sql
2019/06/12 10:56:18 文件 : 13, myDoc\code snippets (expand me!)\Scheme.scm
2019/06/12 10:56:18 文件 : 14, myDoc\code snippets (expand me!)\XML.xml
2019/06/12 10:56:18 文件 : 15, myDoc\index.md
2019/06/12 10:56:18 监控 : 16, myDoc\you can also
2019/06/12 10:56:18 监控 : 17, myDoc\you can also\nest directories
2019/06/12 10:56:18 文件 : 18, myDoc\you can also\nest directories\binary files are OK too.jpg

path.Dir("./myDoc"));
//返回路径最后一个元素的目录
//路径为空则返回.
这个遍历,刚开始的时候,我以为是正确的,后面才发现不对了.
首先,额外监控了给定目录的父目录,也就是myDoc的父目录,参见第一行输出
其次,如果目录下没有文件,接着还是目录,参见输出的17和18行,遍历的时候跳过去了

2019/06/12 10:48:30 监控 : 1, .
2019/06/12 10:48:30 文件 : 2, myDoc\.gitkeep
2019/06/12 10:48:30 文件 : 3, myDoc\Sample HTML document.html
2019/06/12 10:48:30 文件 : 4, myDoc\Sample Markdown document.md
2019/06/12 10:48:30 监控 : 5, myDoc
2019/06/12 10:48:30 文件 : 6, myDoc\code snippets (expand me!)\Bash.sh
2019/06/12 10:48:30 文件 : 7, myDoc\code snippets (expand me!)\CSS.css
2019/06/12 10:48:30 文件 : 8, myDoc\code snippets (expand me!)\JavaScript.js
2019/06/12 10:48:30 文件 : 9, myDoc\code snippets (expand me!)\PHP.php
2019/06/12 10:48:30 文件 : 10, myDoc\code snippets (expand me!)\Python.py
2019/06/12 10:48:30 文件 : 11, myDoc\code snippets (expand me!)\Ruby.rb
2019/06/12 10:48:30 文件 : 12, myDoc\code snippets (expand me!)\SQL.sql
2019/06/12 10:48:30 文件 : 13, myDoc\code snippets (expand me!)\Scheme.scm
2019/06/12 10:48:30 文件 : 14, myDoc\code snippets (expand me!)\XML.xml
2019/06/12 10:48:30 文件 : 15, myDoc\index.md
2019/06/12 10:48:30 监控 : 16, myDoc
2019/06/12 10:48:30 监控 : 17, myDoc\you can also
2019/06/12 10:48:30 文件 : 18, myDoc\you can also\nest directories\binary files are OK too.jpg
目录
相关文章
|
2月前
|
Go
golang中置new()函数和make()函数的区别
golang中置new()函数和make()函数的区别
|
17天前
|
SQL NoSQL Go
技术经验分享:Golang标准库:errors包应用
技术经验分享:Golang标准库:errors包应用
14 0
|
28天前
|
移动开发 Go
golang bufio包怎么用?
`bufio` 是 Go 语言中用于提高 I/O 性能的包,它通过使用缓冲区减少对低效磁盘 I/O 操作的调用。简而言之,`bufio` 提供带缓冲的读写功能,减少读取或写入文件时的系统调用次数,从而提升程序性能。
|
2月前
|
监控 Go 开发者
Golang深入浅出之-Goroutine泄漏检测与避免:pprof与debug包
【5月更文挑战第2天】本文介绍了Go语言并发编程中可能遇到的Goroutine泄漏问题,以及如何使用`pprof`和`debug`包来检测和防止这种泄漏。常见的问题包括忘记关闭channel和无限制创建goroutine。检测方法包括启动pprof服务器以监控Goroutine数量,使用`debug.Stack()`检查堆栈,以及确保每个Goroutine有明确的结束条件。通过这些手段,开发者可以有效管理Goroutine,维持程序性能。
106 7
|
2月前
|
Java Go
Golang深入浅出之-Goroutine泄漏检测与避免:pprof与debug包
【5月更文挑战第1天】本文介绍了Go语言中goroutine泄漏的问题及其影响,列举了忘记关闭通道、无限循环和依赖外部条件等常见泄漏原因。通过引入`net/http/pprof`和`runtime/debug`包,可以检测和避免goroutine泄漏。使用pprof的HTTP服务器查看goroutine堆栈,利用`debug`包的`SetGCPercent`和`FreeOSMemory`函数管理内存。实践中,应使用`sync.WaitGroup`、避免无限循环和及时关闭通道来防止泄漏。理解这些工具和策略对维护Go程序的稳定性至关重要。
72 4
|
2月前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
37 1
|
2月前
|
安全 Go
Golang深入浅出之-Go语言标准库中的文件读写:io/ioutil包
【4月更文挑战第27天】Go语言的`io/ioutil`包提供简单文件读写,适合小文件操作。本文聚焦`ReadFile`和`WriteFile`函数,讨论错误处理、文件权限、大文件处理和编码问题。避免错误的关键在于检查错误、设置合适权限、采用流式读写及处理编码。遵循这些最佳实践能提升代码稳定性。
33 0
|
5天前
|
JSON 测试技术 Go
零值在go语言和初始化数据
【7月更文挑战第10天】本文介绍在Go语言中如何初始化数据,未初始化的变量会有对应的零值:bool为`false`,int为`0`,byte和string为空,pointer、function、interface及channel为`nil`,slice和map也为`nil`。。本文档作为指南,帮助理解Go的数据结构和正确使用它们。
53 22
零值在go语言和初始化数据
|
7天前
|
安全 算法 程序员
在go语言中使用泛型和反射
【7月更文挑战第8天】本文介绍go支持泛型后,提升了代码复用,如操作切片、映射、通道的函数,以及自定义数据结构。 泛型适用于通用数据结构和函数,减少接口使用和类型断言。
68 1
在go语言中使用泛型和反射
|
9天前
|
缓存 编译器 Shell
回顾go语言基础中一些特别的概念
【7月更文挑战第6天】本文介绍Go语言基础涵盖包声明、导入、函数、变量、语句和表达式以及注释。零值可用类型如切片、互斥锁和缓冲,支持预分配容量以优化性能。
40 2
回顾go语言基础中一些特别的概念