Golang path/filepath包详解:高效路径操作与实战案例
Golang path/filepath包详解:高效路径操作与实战案例
- 引言
- 基础用法
- Abs 函数
- Base 函数
- Clean 函数
- Dir 函数
- Ext 函数
- FromSlash 和 ToSlash 函数
- 基础用法
- Abs 函数
- Base 函数
- Clean 函数
- Dir 函数
- Ext 函数
- FromSlash 和 ToSlash 函数
- 路径操作
- Join 函数
- Split 函数
- Rel 函数
- Match 函数
- Glob 函数
- 文件路径遍历
- Walk 和 WalkDir 函数
- 遍历目录树的技巧
- 根据文件扩展名过滤文件
- 根据文件大小过滤文件
- 其他自定义过滤条件
- 路径匹配
- Match 函数的高级用法
- 使用正则表达式进行路径匹配
- 路径过滤
- 根据文件扩展名过滤文件
- 根据文件大小过滤文件
- 其他自定义过滤条件
- 实际案例
- 示例1:实现一个简单的文件搜索工具
- 示例2:实现一个目录同步工具
- 示例3:实现一个文件分类工具
- 常见问题与解决方案
- 常见错误及调试技巧
- 路径不存在或无效
- 路径分隔符问题
- 性能优化建议
- 总结

引言
在Go语言的标准库中,path/filepath包是一个非常重要的工具包,它提供了一系列函数用于操作和处理文件路径。在实际开发中,正确和高效地操作文件路径是每个开发者必备的技能。无论是构建文件路径、解析路径中的各个部分,还是遍历目录树,path/filepath包都提供了便捷的方法来完成这些任务。
本文将详细介绍path/filepath包的用法和技巧,通过丰富的代码示例来展示如何在实际开发中使用这些功能。无论你是处理文件路径的基本操作,还是需要更复杂的路径匹配和过滤,本教程都将为你提供全面的指导。
在接下来的章节中,我们将依次介绍path/filepath包的基础用法、路径操作、文件路径遍历、路径匹配、路径过滤,并结合实际案例来展示这些功能的应用场景。希望通过本文的讲解,能够帮助你更好地理解和使用path/filepath包,从而提升你的开发效率。
基础用法
在这一部分,我们将介绍path/filepath包中的一些基础函数,这些函数是处理文件路径时最常用的工具。通过学习这些函数的用法,你将能够轻松地进行路径的构建、解析和转换。
Abs 函数
Abs函数用于将相对路径转换为绝对路径。它的定义如下:
func Abs(path string) (string, error)
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {relativePath := "path/to/file"absolutePath, err := filepath.Abs(relativePath)if err != nil {fmt.Println("Error:", err)}fmt.Println("Absolute Path:", absolutePath)
}
在这个示例中,我们将相对路径"path/to/file"转换为绝对路径。如果路径不存在或无效,Abs函数将返回一个错误。
Base 函数
Base函数返回路径的最后一个元素。如果路径为空字符串,Base返回.。它的定义如下:
func Base(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"base := filepath.Base(path)fmt.Println("Base:", base)
}
在这个示例中,Base函数返回路径"/path/to/file.txt"的最后一个元素,即"file.txt"。
Clean 函数
Clean函数通过删除冗余的分隔符和引用使路径更规范。它的定义如下:
func Clean(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {dirtyPath := "/path//to/../file"cleanPath := filepath.Clean(dirtyPath)fmt.Println("Clean Path:", cleanPath)
}
在这个示例中,Clean函数将路径"/path//to/../file"规范化为"/path/file"。
Dir 函数
Dir函数返回路径中除去最后一个元素的部分,即路径的目录部分。如果路径为空字符串,Dir返回.。它的定义如下:
func Dir(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"dir := filepath.Dir(path)fmt.Println("Directory:", dir)
}
在这个示例中,Dir函数返回路径"/path/to/file.txt"的目录部分,即"/path/to"。
Ext 函数
Ext函数返回路径中文件的扩展名。如果文件没有扩展名,返回空字符串。它的定义如下:
func Ext(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"ext := filepath.Ext(path)fmt.Println("Extension:", ext)
}
在这个示例中,Ext函数返回路径"/path/to/file.txt"中文件的扩展名,即.txt。
FromSlash 和 ToSlash 函数
FromSlash函数将使用斜杠(/)的路径转换为系统特定的路径分隔符。ToSlash函数则将系统特定的路径分隔符转换为斜杠(/)。它们的定义如下:
func FromSlash(path string) string
func ToSlash(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {unixPath := "/path/to/file"windowsPath := filepath.FromSlash(unixPath)fmt.Println("Windows Path:", windowsPath)windowsPath2 := "C:\\path\\to\\file"unixPath2 := filepath.ToSlash(windowsPath2)fmt.Println("Unix Path:", unixPath2)
}
在这个示例中,FromSlash函数将Unix风格的路径"/path/to/file"转换为Windows风格的路径(在Windows系统上运行),ToSlash函数将Windows风格的路径"C:\\path\\to\\file"转换为Unix风格的路径。
基础用法
在这一部分,我们将介绍path/filepath包中的一些基础函数,这些函数是处理文件路径时最常用的工具。通过学习这些函数的用法,你将能够轻松地进行路径的构建、解析和转换。
Abs 函数
Abs函数用于将相对路径转换为绝对路径。它的定义如下:
func Abs(path string) (string, error)
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {relativePath := "path/to/file"absolutePath, err := filepath.Abs(relativePath)if err != nil {fmt.Println("Error:", err)}fmt.Println("Absolute Path:", absolutePath)
}
在这个示例中,我们将相对路径"path/to/file"转换为绝对路径。如果路径不存在或无效,Abs函数将返回一个错误。
Base 函数
Base函数返回路径的最后一个元素。如果路径为空字符串,Base返回.。它的定义如下:
func Base(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"base := filepath.Base(path)fmt.Println("Base:", base)
}
在这个示例中,Base函数返回路径"/path/to/file.txt"的最后一个元素,即"file.txt"。
Clean 函数
Clean函数通过删除冗余的分隔符和引用使路径更规范。它的定义如下:
func Clean(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {dirtyPath := "/path//to/../file"cleanPath := filepath.Clean(dirtyPath)fmt.Println("Clean Path:", cleanPath)
}
在这个示例中,Clean函数将路径"/path//to/../file"规范化为"/path/file"。
Dir 函数
Dir函数返回路径中除去最后一个元素的部分,即路径的目录部分。如果路径为空字符串,Dir返回.。它的定义如下:
func Dir(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"dir := filepath.Dir(path)fmt.Println("Directory:", dir)
}
在这个示例中,Dir函数返回路径"/path/to/file.txt"的目录部分,即"/path/to"。
Ext 函数
Ext函数返回路径中文件的扩展名。如果文件没有扩展名,返回空字符串。它的定义如下:
func Ext(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"ext := filepath.Ext(path)fmt.Println("Extension:", ext)
}
在这个示例中,Ext函数返回路径"/path/to/file.txt"中文件的扩展名,即.txt。
FromSlash 和 ToSlash 函数
FromSlash函数将使用斜杠(/)的路径转换为系统特定的路径分隔符。ToSlash函数则将系统特定的路径分隔符转换为斜杠(/)。它们的定义如下:
func FromSlash(path string) string
func ToSlash(path string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {unixPath := "/path/to/file"windowsPath := filepath.FromSlash(unixPath)fmt.Println("Windows Path:", windowsPath)windowsPath2 := "C:\\path\\to\\file"unixPath2 := filepath.ToSlash(windowsPath2)fmt.Println("Unix Path:", unixPath2)
}
在这个示例中,FromSlash函数将Unix风格的路径"/path/to/file"转换为Windows风格的路径(在Windows系统上运行),ToSlash函数将Windows风格的路径"C:\\path\\to\\file"转换为Unix风格的路径。
路径操作
在这一部分,我们将介绍如何使用path/filepath包中的函数进行路径的连接、拆分和相对路径计算等操作。
Join 函数
Join函数将任意数量的路径元素连接成一个单一路径,并根据需要添加斜杠。它的定义如下:
func Join(elem ...string) string
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {path1 := "path/to"path2 := "file"fullPath := filepath.Join(path1, path2)fmt.Println("Full Path:", fullPath)
}
在这个示例中,Join函数将路径"path/to"和"file"连接成一个单一路径"path/to/file"。
Split 函数
Split函数将路径拆分为目录和文件名两部分。它的定义如下:
func Split(path string) (dir, file string)
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"dir, file := filepath.Split(path)fmt.Println("Directory:", dir)fmt.Println("File:", file)
}
在这个示例中,Split函数将路径"/path/to/file.txt"拆分为目录部分"/path/to/"和文件名部分"file.txt"。
Rel 函数
Rel函数返回一个相对路径,将base目录作为起点,目标目录作为终点。它的定义如下:
func Rel(basepath, targpath string) (string, error)
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {basepath := "/path/to"targpath := "/path/to/file.txt"relativePath, err := filepath.Rel(basepath, targpath)if err != nil {fmt.Println("Error:", err)}fmt.Println("Relative Path:", relativePath)
}
在这个示例中,Rel函数返回"/path/to"目录和"/path/to/file.txt"文件之间的相对路径,即"file.txt"。
Match 函数
Match函数根据指定的模式匹配路径名。它的定义如下:
func Match(pattern, name string) (matched bool, err error)
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {pattern := "*.txt"name := "file.txt"matched, err := filepath.Match(pattern, name)if err != nil {fmt.Println("Error:", err)}fmt.Println("Matched:", matched)
}
在这个示例中,Match函数根据模式"*.txt"匹配路径名"file.txt",返回true表示匹配成功。
Glob 函数
Glob函数返回所有匹配模式的文件名或错误。它的定义如下:
func Glob(pattern string) (matches []string, err error)
示例代码:
package mainimport ("fmt""path/filepath"
)func main() {pattern := "/path/to/*.txt"matches, err := filepath.Glob(pattern)if err != nil {fmt.Println("Error:", err)}fmt.Println("Matches:", matches)
}
在这个示例中,Glob函数返回所有匹配模式"/path/to/*.txt"的文件名。
文件路径遍历
在这一部分,我们将介绍如何使用path/filepath包中的函数遍历文件路径,包括遍历目录树以及处理遍历过程中的一些技巧。
Walk 和 WalkDir 函数
Walk和WalkDir函数用于遍历指定目录下的所有文件和子目录。它们的定义如下:
func Walk(root string, walkFn WalkFunc) error
func WalkDir(root string, walkFn WalkDirFunc) error
WalkFunc类型和WalkDirFunc类型的定义如下:
type WalkFunc func(path string, info os.FileInfo, err error) error
type WalkDirFunc func(path string, d fs.DirEntry, err error) error
示例代码:
package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}fmt.Println("Visited:", path)return nil})if err != nil {fmt.Println("Error:", err)}
}
在这个示例中,Walk函数遍历指定目录"/path/to/directory"下的所有文件和子目录,并在遍历过程中打印每个访问的路径。
遍历目录树的技巧
在遍历目录树时,我们可能需要过滤特定类型的文件或目录,或者对每个访问的文件进行特定的操作。以下是一些常见的技巧:
根据文件扩展名过滤文件
我们可以在WalkFunc中添加条件来过滤特定扩展名的文件。例如,只打印扩展名为.txt的文件:
package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if filepath.Ext(path) == ".txt" {fmt.Println("Visited:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}
根据文件大小过滤文件
我们可以在WalkFunc中添加条件来过滤特定大小的文件。例如,只打印大于1MB的文件:
package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.Size() > 1*1024*1024 { // 大于1MBfmt.Println("Visited:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}
其他自定义过滤条件
我们可以根据需要添加各种自定义过滤条件,例如根据文件名、创建时间等进行过滤。以下示例根据文件名包含特定字符串进行过滤:
package mainimport ("fmt""os""path/filepath""strings"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if strings.Contains(info.Name(), "example") {fmt.Println("Visited:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}
在这个示例中,Walk函数仅打印文件名包含字符串"example"的文件。
路径匹配
在这一部分,我们将深入探讨路径匹配的高级用法,包括如何使用path/filepath包中的函数进行更复杂的路径匹配。
Match 函数的高级用法
Match函数不仅可以用来进行简单的模式匹配,还可以结合循环和条件语句进行更复杂的路径匹配操作。例如,我们可以匹配多个模式或排除特定模式:
package mainimport ("fmt""path/filepath"
)func main() {patterns := []string{"*.txt", "*.md"}name := "file.txt"matched := falsefor _, pattern := range patterns {match, err := filepath.Match(pattern, name)if err != nil {fmt.Println("Error:", err)return}if match {matched = truebreak}}fmt.Println("Matched:", matched)
}
在这个示例中,我们使用Match函数匹配多个模式"*.txt"和"*.md",如果路径名"file.txt"匹配任一模式,则返回true。
使用正则表达式进行路径匹配
除了使用Match函数,我们还可以使用Go语言的正则表达式库regexp进行更灵活的路径匹配:
package mainimport ("fmt""path/filepath""regexp"
)func main() {pattern := `.*\.txt$`re, err := regexp.Compile(pattern)if err != nil {fmt.Println("Error:", err)return}name := "file.txt"matched := re.MatchString(filepath.Base(name))fmt.Println("Matched:", matched)
}
在这个示例中,我们使用正则表达式模式".*\.txt$"匹配路径名"file.txt",如果匹配成功则返回true。
路径过滤
在这一部分,我们将介绍如何根据不同的条件对路径进行过滤,包括文件扩展名、文件大小以及其他自定义条件。
根据文件扩展名过滤文件
我们可以使用filepath.Ext函数来获取文件的扩展名,并根据扩展名进行过滤。例如,过滤出所有扩展名为.txt的文件:
package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if filepath.Ext(path) == ".txt" {fmt.Println("Found .txt file:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}
根据文件大小过滤文件
我们可以使用os.FileInfo的Size方法来获取文件的大小,并根据大小进行过滤。例如,过滤出所有大于1MB的文件:
package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.Size() > 1*1024*1024 {fmt.Println("Found large file:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}
其他自定义过滤条件
我们可以根据不同的需求添加自定义的过滤条件。例如,根据文件名、修改时间或其他文件属性进行过滤。以下是一个根据文件名中包含特定字符串进行过滤的示例:
package mainimport ("fmt""os""path/filepath""strings"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if strings.Contains(info.Name(), "example") {fmt.Println("Found file:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}
在这个示例中,Walk函数过滤出文件名中包含字符串"example"的文件。
实际案例
在这一部分,我们将通过几个实际案例来展示如何使用path/filepath包中的函数来实现特定的功能。这些案例包括实现一个简单的文件搜索工具、目录同步工具和文件分类工具。
示例1:实现一个简单的文件搜索工具
我们将实现一个简单的文件搜索工具,用户可以通过指定搜索目录和文件名模式来查找文件。
package mainimport ("flag""fmt""os""path/filepath"
)func main() {var searchDir stringvar pattern stringflag.StringVar(&searchDir, "dir", ".", "search directory")flag.StringVar(&pattern, "pattern", "*.txt", "search pattern")flag.Parse()err := filepath.Walk(searchDir, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if matched, err := filepath.Match(pattern, info.Name()); err != nil {return err} else if matched {fmt.Println("Found:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}
在这个示例中,我们使用flag包来解析命令行参数,用户可以指定搜索目录和文件名模式。然后使用Walk函数遍历指定目录,查找匹配模式的文件。
示例2:实现一个目录同步工具
我们将实现一个简单的目录同步工具,将源目录中的所有文件复制到目标目录。
package mainimport ("fmt""io""os""path/filepath"
)func copyFile(src, dst string) error {inFile, err := os.Open(src)if err != nil {return err}defer inFile.Close()outFile, err := os.Create(dst)if err != nil {return err}defer outFile.Close()_, err = io.Copy(outFile, inFile)if err != nil {return err}return outFile.Sync()
}func main() {srcDir := "/path/to/source"dstDir := "/path/to/destination"err := filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.IsDir() {return nil}relPath, err := filepath.Rel(srcDir, path)if err != nil {return err}dstPath := filepath.Join(dstDir, relPath)if err := os.MkdirAll(filepath.Dir(dstPath), os.ModePerm); err != nil {return err}return copyFile(path, dstPath)})if err != nil {fmt.Println("Error:", err)}
}
在这个示例中,我们实现了copyFile函数来复制文件内容。然后使用Walk函数遍历源目录,将每个文件复制到目标目录的相应位置。
示例3:实现一个文件分类工具
我们将实现一个文件分类工具,根据文件扩展名将文件移动到相应的目录。
package mainimport ("fmt""os""path/filepath"
)func moveFile(src, dst string) error {if err := os.MkdirAll(filepath.Dir(dst), os.ModePerm); err != nil {return err}return os.Rename(src, dst)
}func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.IsDir() {return nil}ext := filepath.Ext(info.Name())dstDir := filepath.Join(root, ext[1:]) // 去掉扩展名前的点dstPath := filepath.Join(dstDir, info.Name())if err := moveFile(path, dstPath); err != nil {return err}fmt.Println("Moved:", path, "to", dstPath)return nil})if err != nil {fmt.Println("Error:", err)}
}
在这个示例中,我们实现了moveFile函数来移动文件。然后使用Walk函数遍历目录,将文件根据扩展名移动到相应的子目录中。
常见问题与解决方案
在这一部分,我们将讨论在使用path/filepath包时可能遇到的常见问题,并提供相应的解决方案和调试技巧。
常见错误及调试技巧
路径不存在或无效
在使用Abs、Rel等函数时,如果路径不存在或无效,可能会导致错误。建议在操作路径之前,使用os.Stat函数检查路径是否存在。
package mainimport ("fmt""os""path/filepath"
)func main() {path := "path/to/file"if _, err := os.Stat(path); os.IsNotExist(err) {fmt.Println("Path does not exist:", path)return}absolutePath, err := filepath.Abs(path)if err != nil {fmt.Println("Error:", err)}fmt.Println("Absolute Path:", absolutePath)
}
路径分隔符问题
在跨平台开发中,不同操作系统的路径分隔符不同,可能导致路径处理问题。建议使用filepath.FromSlash和filepath.ToSlash函数进行路径分隔符的转换。
package mainimport ("fmt""path/filepath"
)func main() {unixPath := "/path/to/file"windowsPath := filepath.FromSlash(unixPath)fmt.Println("Windows Path:", windowsPath)windowsPath2 := "C:\\path\\to\\file"unixPath2 := filepath.ToSlash(windowsPath2)fmt.Println("Unix Path:", unixPath2)
}
性能优化建议
在处理大量文件路径时,可以通过以下方式优化性能:
- 批量操作:尽量减少多次I/O操作,可以通过批量处理文件路径来减少I/O次数。
- 缓存结果:对于频繁访问的路径,可以将结果缓存起来,避免重复计算。
- 并发处理:使用Go语言的并发特性,通过多个goroutine并发处理文件路径,提升处理效率。
示例代码:
package mainimport ("fmt""os""path/filepath""sync"
)func processFile(path string, info os.FileInfo) {fmt.Println("Processing:", path)
}func main() {root := "/path/to/directory"var wg sync.WaitGrouperr := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}wg.Add(1)go func() {defer wg.Done()processFile(path, info)}()return nil})if err != nil {fmt.Println("Error:", err)}wg.Wait()
}
在这个示例中,我们使用goroutine并发处理文件路径,提升了处理效率。
总结
通过本文的介绍,我们详细讲解了Go语言标准库中path/filepath包的用法和技巧。无论是基础的路径操作、复杂的路径匹配与过滤,还是实际案例的实现,我们都通过丰富的代码示例展示了如何在实际开发中高效地使用path/filepath包。
希望通过本文的讲解,能够帮助你更好地理解和使用path/filepath包,从而提升开发效率。如果你想进一步深入学习Go语言的文件路径处理,建议参考官方文档和相关的开源项目,不断实践和积累经验。
相关文章:
Golang path/filepath包详解:高效路径操作与实战案例
Golang path/filepath包详解:高效路径操作与实战案例 引言基础用法Abs 函数Base 函数Clean 函数Dir 函数Ext 函数FromSlash 和 ToSlash 函数 基础用法Abs 函数Base 函数Clean 函数Dir 函数Ext 函数FromSlash 和 ToSlash 函数 路径操作Join 函数Split 函数Rel 函数Ma…...
【Shiro】Shiro 的学习教程(四)之 SpringBoot 集成 Shiro 原理
目录 1、第一阶段:启动服务,构建类的功能2、第二阶段:正式请求 1、第一阶段:启动服务,构建类的功能 查看 Shiro 配置类 ShiroConfiguration: Configuration public class ShiroConfiguration {// 创建 sh…...
多线程篇(阻塞队列- PriorityBlockingQueue)(持续更新迭代)
目录 一、简介 二、类图 三、源码解析 1. 字段讲解 2. 构造方法 3. 入队方法 put 浮调整比较器方法的实现 入队图解 4. 出队方法 take dequeue 下沉调整比较器方法的实现 出队图解 四、总结 一、简介 PriorityBlockingQueue队列是 JDK1.5 的时候出来的一个阻塞…...
strstr函数的使用和模拟实现
目录 1.头文件 2.strstr函数的使用 3.strstr函数模拟实现 小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化! 1.头文件 strstr函数的使用需要头文件 #include<string.h>…...
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
背景/引言 在数据驱动的时代,网络爬虫成为了收集和分析海量数据的关键工具。为了应对不同浏览器环境下的兼容性问题,Selenium与WebDriver成为了开发者实现跨浏览器自动化数据抓取的首选工具。本文将深入探讨如何利用Selenium和WebDriver实现跨浏览器的数…...
信创实践(3):基于x2openEuler将CentOS升级成openEuler,享受其带来的创新和安全特性
引言: 在当前的 IT 行业中,创新和安全性是两大关键趋势。随着 CentOS 停止维护,许多用户正在寻找替代方案,以保持其系统的更新和安全。openEuler 作为一个强大的开源操作系统,成为了理想的迁移目标。本教程将指导您如…...
LEAN 类型理论之注解(Annotations of LEAN Type Theory)-- 相等类型(Equality Type)
《何谓相等 (Equality),在类型理论(Type Theory)语境下》 与 《转化(conversion and reduction)后的相等(Equality)》,两文中,已对相等(Equality)的概念进行了描述&#…...
Idea 创建 Maven项目的时候卡死
文章目录 一、Archetype 和 Catalog1.1 Archetype(原型)1.2 Catalog(目录) 二、可能遇到的问题2.1 问题描述2.2 原因分析2.3 解决方案 参考资料 一、Archetype 和 Catalog 1.1 Archetype(原型) Archetype…...
C++入门(02)简单了解C++应用程序的开发部署
文章目录 1. 开发C应用程序2. 简单示例计算器程序3. 需求分析4. 设计5. 编码6. 编译7. 调试8. 测试9. 部署10. 部署示例10.1 使用Visual Studio Installer Projects创建安装程序10.2 安装VisualStudio Installer Projects扩展10.3 在calculator解决方案中创建安装项目10.3.1 添…...
有了室内外一体化人行导航,你还怕迷路吗?
在快节奏的现代生活中,无论是穿梭于繁华的都市丛林,还是漫步于错综复杂的购物中心,迷路似乎成了不少人的“小确丧”。然而,随着科技的飞速发展,一项革命性的创新——室内外一体化人行导航系统,正悄然改变着…...
Python虚拟环境包迁移
1. 激活源虚拟环境 首先,激活你想要导出包的源虚拟环境。在命令行中输入: Windows: path\to\your\source_env\Scripts\activatemacOS/Linux: source path/to/your/source_env/bin/activate 2. 导出已安装包的列表 使用以下命令生成一个requirements…...
利用分布式锁在ASP.NET Core中实现防抖
前言 在 Web 应用开发过程中,防抖(Debounce) 是确保同一操作在短时间内不会被重复触发的一种有效手段。常见的场景包括防止用户在短时间内重复提交表单,或者避免多次点击按钮导致后台服务执行多次相同的操作。无论在单机环境中&a…...
Django+Vue3前后端分离学习(二)(重写User类)
一、重写User类: 1、首先导入User类: from django.contrib.auth.models import User 2、然后点在User上,按住ctrl 点进去,发现 User类继承AbstractUser Ctrl点进去AbstractUser,然后将此方法全部复制到自己APP的mo…...
兔英语语法体系——观后笔记
目录 一、视频链接 二、视频前言 三、简单句(Simple Sentences) 1. 可独立完成的动作 2. 有1个动作的承受者 3. 有两个动作承受者 4. 只有一个动作承受者(但需补充) 5. 非 “动作” 6. 总结 四、五大基本句型 五、句子成分 6. 定语 7. 状语 8. 同位语 9. 总结 …...
哈希表如何避免冲突
系列文章: 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 3. 哈希表如何避免冲突 目录 1.概念 2. 冲突-概念 3. 冲突-避免 3.1 冲突-避免-哈希函数设计 3.2 冲突-避免-负载因子调节 4. 冲突-解决 4.1 冲突-解决-闭散列 4.1.1 线性探…...
内核模块驱动开发
内核模块开始学习前,一定是最先接触到内核模块三要素(面试),驱动入口、驱动出口和协议的遵循。 1.内核模块三要素(面试)//修饰模块化驱动的入口函数module_init(demo_init);//修饰模块化驱动的出口函数module_eixt(demo_exit);//遵循GPL开源协议MODULE_…...
Linux 下 alsa 库录音并保存为 WAV 格式
麦克风列表: [jnjn build]$ arecord -l **** List of CAPTURE Hardware Devices **** card 0: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]Subdevices: 1/1Subdevice #0: subdevice #0 card 1: Camera [2K USB Camera], device 0: USB Aud…...
使用stripe进行在线支付、退款、订阅、取消订阅功能(uniapp+h5)
stripe官网:Stripe 登录 | 登录 Stripe 管理平台 然后在首页当中打开测试模式,使用测试的公钥跟私钥进行开发 测试卡号 4242 4242 4242 4242 1234 567 在线支付 stripe的在线支付有两种,第一种就是无代码,第二中就是使用api进行自定义,一般来说推荐第二种进行开发 无…...
深度学习中常见的损失函数
关注B站可以观看更多实战教学视频:hallo128的个人空间 深度学习中常见的损失函数 损失函数的作用 损失函数是衡量神经网络输出与真实标签之间差距的指标。在训练过程中,神经网络的目标是最小化损失函数的值。常见的损失函数包括均方误差(MS…...
认识Linux及Linux的环境搭建
目录 1、什么是Linux2、Linux环境搭建2.1 下载安装 Xshell2.2 下载安装 VMware Workstation Pro2.3 选择适合自己系统 1、什么是Linux Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼ÿ…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
