路径处理秘籍:Golang path包最佳实践与技巧

路径处理秘籍:Golang path包最佳实践与技巧

    • 引言
    • 基本概念和功能
      • path包简介
      • 路径的概念:相对路径与绝对路径
      • 常见操作函数概览
    • 路径清理和拼接
      • path.Clean
      • path.Join
      • path.Split
    • 路径提取与处理
      • path.Base
      • path.Dir
      • path.Ext
      • 处理不同操作系统的路径分隔符
    • 路径匹配与查找
      • path.Match
      • filepath.Glob
      • 在实际项目中的应用场景
    • 路径规范化与安全性
      • 规范化路径的重要性
        • 示例:
      • 安全处理路径的最佳实践
        • 验证和清理用户输入
        • 限制访问范围
      • 常见错误及避免方法
        • 忽视路径规范化
        • 直接拼接用户输入路径
        • 未验证路径合法性
    • 高级用法与实战案例
      • 高级用法介绍
        • 使用path.Join处理URL路径
        • 动态生成路径
      • 实战案例:项目中的路径处理
        • 实战案例1:图片上传路径处理
        • 实战案例2:配置文件路径处理
      • 实战案例:文件系统操作
        • 实战案例3:批量文件重命名
    • 总结与最佳实践
      • 总结文章内容
      • 提供路径处理的最佳实践和建议
      • 结语

在这里插入图片描述

引言

在Golang开发中,路径处理是一个常见且重要的任务。无论是处理文件系统操作、解析URL,还是进行网络请求,路径处理都不可避免。Golang标准库中的path包提供了一组简洁而强大的函数,用于处理Unix风格的路径字符串。通过这些函数,我们可以轻松地进行路径的拼接、清理、匹配和提取操作。

本文将深入介绍path包的各种功能及其在实际开发中的应用技巧。文章内容将包括基本概念和功能、路径清理与拼接、路径提取与处理、路径匹配与查找、路径规范化与安全性以及一些高级用法和实战案例。通过这篇文章,读者将能够全面了解如何使用path包高效地处理路径相关的操作,提高代码的可读性和可靠性。

基本概念和功能

path包简介

path包是Golang标准库中用于处理路径字符串的一个工具包,主要针对的是Unix风格的路径。与之对应的,还有一个path/filepath包,用于处理与操作系统相关的文件路径。在实际开发中,path包主要用于处理网络路径或其他Unix风格的路径。

路径的概念:相对路径与绝对路径

在开始具体介绍path包的函数之前,我们先来了解一下路径的基本概念:

  • 相对路径:相对路径是相对于当前工作目录或某个特定目录的路径。例如,./folder/file.txt表示当前目录下的一个文件。
  • 绝对路径:绝对路径是从根目录开始的完整路径。例如,/home/user/folder/file.txt表示从根目录开始的文件路径。

常见操作函数概览

path包提供了多个函数来操作路径字符串,以下是一些常见的函数及其基本介绍:

  • path.Clean(path string) string:清理路径,返回一个规范化的路径。
  • path.Join(elem ...string) string:连接多个路径元素,返回一个单一的路径。
  • path.Split(path string) (dir, file string):将路径分割为目录和文件名。
  • path.Base(path string) string:返回路径的最后一个元素。
  • path.Dir(path string) string:返回路径的目录部分。
  • path.Ext(path string) string:返回路径的扩展名。
  • path.Match(pattern, name string) (matched bool, err error):判断路径是否匹配给定的模式。

接下来,我们将详细介绍这些函数的用法和示例。

路径清理和拼接

path.Clean

path.Clean函数用于清理路径,去除多余的字符和相对路径部分,返回一个规范化的路径。例如:

package mainimport ("fmt""path"
)func main() {p := "/a/b/../c/./d"cleanedPath := path.Clean(p)fmt.Println(cleanedPath) // 输出: /a/c/d
}

在上面的例子中,path.Clean函数移除了路径中的...,返回了一个更为规范的路径。

path.Join

path.Join函数用于连接多个路径元素,返回一个单一的路径。例如:

package mainimport ("fmt""path"
)func main() {p1 := "a"p2 := "b/c"p3 := "../d"joinedPath := path.Join(p1, p2, p3)fmt.Println(joinedPath) // 输出: a/b/d
}

在这个例子中,path.Join函数自动处理了路径元素之间的分隔符,并去除了多余的..部分,生成了一个规范化的路径。

path.Split

path.Split函数用于将路径分割为目录和文件名两部分。例如:

package mainimport ("fmt""path"
)func main() {p := "/a/b/c/d.txt"dir, file := path.Split(p)fmt.Println("Dir:", dir)   // 输出: /a/b/c/fmt.Println("File:", file) // 输出: d.txt
}

在这个例子中,path.Split函数将路径/a/b/c/d.txt分割成了目录/a/b/c/和文件名d.txt

通过这些基本的路径操作函数,我们可以轻松地进行路径的清理、拼接和分割。在实际开发中,这些函数可以帮助我们更好地管理和处理路径,提高代码的可读性和可靠性。

路径提取与处理

在路径处理过程中,我们经常需要提取路径中的某些部分,比如获取路径的文件名、目录或扩展名。path包提供了一些简洁的函数来完成这些操作。接下来,我们将详细介绍这些函数的用法及其在实际开发中的应用。

path.Base

path.Base函数用于返回路径的最后一个元素。如果路径为空字符串,path.Base返回.。如果路径只有斜杠,path.Base返回/。例如:

package mainimport ("fmt""path"
)func main() {p1 := "/a/b/c/d.txt"p2 := "/a/b/c/"p3 := ""fmt.Println(path.Base(p1)) // 输出: d.txtfmt.Println(path.Base(p2)) // 输出: cfmt.Println(path.Base(p3)) // 输出: .
}

在这个例子中,path.Base提取了路径的最后一个元素,分别是d.txtc

path.Dir

path.Dir函数用于返回路径的目录部分。返回的路径末尾总是没有斜杠,除非路径是根目录。例如:

package mainimport ("fmt""path"
)func main() {p1 := "/a/b/c/d.txt"p2 := "/a/b/c/"p3 := "d.txt"fmt.Println(path.Dir(p1)) // 输出: /a/b/cfmt.Println(path.Dir(p2)) // 输出: /a/bfmt.Println(path.Dir(p3)) // 输出: .
}

在这个例子中,path.Dir提取了路径的目录部分。

path.Ext

path.Ext函数用于返回路径的扩展名。如果路径中没有扩展名,path.Ext返回空字符串。例如:

package mainimport ("fmt""path"
)func main() {p1 := "/a/b/c/d.txt"p2 := "/a/b/c/d"p3 := "/a/b/c/.hidden"fmt.Println(path.Ext(p1)) // 输出: .txtfmt.Println(path.Ext(p2)) // 输出: fmt.Println(path.Ext(p3)) // 输出: 
}

在这个例子中,path.Ext提取了路径的扩展名txt,而没有扩展名的路径返回空字符串。

处理不同操作系统的路径分隔符

虽然path包主要用于处理Unix风格的路径,但在实际开发中,我们可能需要处理不同操作系统的路径分隔符。为此,我们可以使用path/filepath包中的函数来处理与操作系统相关的路径。以下是一个示例:

package mainimport ("fmt""path/filepath"
)func main() {p := "a\\b\\c\\d.txt"cleanedPath := filepath.ToSlash(p)fmt.Println(cleanedPath) // 输出: a/b/c/d.txt
}

在这个例子中,我们使用了filepath.ToSlash函数将Windows风格的路径分隔符转换为Unix风格的路径分隔符。

通过这些函数,我们可以轻松地提取路径中的文件名、目录和扩展名,并处理不同操作系统的路径分隔符。这些操作在实际开发中非常常见,能够帮助我们更高效地处理路径相关的任务。

路径匹配与查找

在开发过程中,有时需要对路径进行模式匹配或查找特定的文件或目录。path包提供了一些函数,可以方便地实现这些功能。接下来,我们将详细介绍这些函数的用法及其在实际开发中的应用。

path.Match

path.Match函数用于判断路径是否匹配给定的模式。模式使用类似于shell的文件名匹配语法,包括*?和字符范围(用方括号表示)。例如:

  • *匹配零个或多个非斜杠字符
  • ?匹配一个非斜杠字符
  • [abc]匹配方括号中的任意一个字符
  • [a-z]匹配范围内的任意字符

下面是一个使用path.Match的示例:

package mainimport ("fmt""path"
)func main() {pattern := "a/b/*/d.txt"name1 := "a/b/c/d.txt"name2 := "a/b/c/e/d.txt"matched1, err1 := path.Match(pattern, name1)matched2, err2 := path.Match(pattern, name2)if err1 != nil {fmt.Println("Error:", err1)} else {fmt.Println(name1, "matches pattern", pattern, ":", matched1)}if err2 != nil {fmt.Println("Error:", err2)} else {fmt.Println(name2, "matches pattern", pattern, ":", matched2)}
}

输出结果:

a/b/c/d.txt matches pattern a/b/*/d.txt : true
a/b/c/e/d.txt matches pattern a/b/*/d.txt : false

在这个例子中,path.Match用于判断路径a/b/c/d.txt是否匹配模式a/b/*/d.txt,结果为true。而a/b/c/e/d.txt则不匹配该模式,结果为false

filepath.Glob

虽然path包中没有提供路径查找的函数,但path/filepath包中提供了filepath.Glob函数,用于根据模式查找匹配的文件和目录。下面是一个使用filepath.Glob的示例:

package mainimport ("fmt""path/filepath"
)func main() {pattern := "a/b/*.txt"matches, err := filepath.Glob(pattern)if err != nil {fmt.Println("Error:", err)} else {for _, match := range matches {fmt.Println("Matched:", match)}}
}

在这个例子中,filepath.Glob根据模式a/b/*.txt查找匹配的文件和目录,并打印出所有匹配的路径。

在实际项目中的应用场景

路径匹配和查找在实际项目中有很多应用场景。例如:

  • 文件搜索:在一个目录中查找符合特定模式的文件。
  • 路径过滤:过滤掉不符合特定模式的路径。
  • 批量处理:对符合特定模式的文件进行批量处理,如批量重命名、批量删除等。

下面是一个实际项目中的示例,演示如何使用path.Matchfilepath.Glob进行路径过滤和批量处理:

package mainimport ("fmt""path""path/filepath"
)func main() {files := []string{"a/b/c/d.txt","a/b/c/e.txt","a/b/c/f.go","a/b/c/g.md",}pattern := "*.txt"for _, file := range files {matched, err := path.Match(pattern, filepath.Base(file))if err != nil {fmt.Println("Error:", err)continue}if matched {fmt.Println("Matched:", file)}}
}

输出结果:

Matched: a/b/c/d.txt
Matched: a/b/c/e.txt

在这个例子中,我们使用path.Match对文件列表进行过滤,只打印出符合.txt模式的文件路径。

通过这些示例,我们可以看到path包和path/filepath包提供的路径匹配和查找功能在实际开发中的应用场景和便利性。这些函数能够帮助我们高效地处理路径相关的任务,提高代码的可读性和可靠性。

路径规范化与安全性

在处理路径时,路径的规范化和安全性是两个非常重要的方面。规范化路径可以避免冗余和错误,而安全处理路径则可以防止一些常见的安全漏洞。接下来,我们将详细介绍路径规范化的重要性、安全处理路径的最佳实践以及一些常见错误及其避免方法。

规范化路径的重要性

路径规范化是指将路径转换为标准形式,以去除冗余部分,并确保路径的唯一性。这对于避免路径错误和提高代码可读性至关重要。path.Clean函数是实现路径规范化的一个常用工具。我们在前面已经介绍过它的用法,这里再详细说明一下其重要性。

示例:
package mainimport ("fmt""path"
)func main() {p1 := "/a/b/../c/./d/"p2 := "/a/b/c/../../d/e/"fmt.Println(path.Clean(p1)) // 输出: /a/c/dfmt.Println(path.Clean(p2)) // 输出: /d/e
}

在这个例子中,path.Clean函数通过去除冗余部分,将路径规范化为标准形式。这不仅有助于减少路径错误,还可以提高代码的可读性和维护性。

安全处理路径的最佳实践

在处理路径时,安全性是一个不可忽视的因素。特别是在处理用户输入或网络请求时,不安全的路径操作可能会导致严重的安全漏洞,如目录遍历攻击(Directory Traversal)。下面是一些安全处理路径的最佳实践。

验证和清理用户输入

无论何时处理用户输入的路径,都应先进行验证和清理。使用path.Clean函数可以去除不必要的冗余部分,并将路径规范化。

package mainimport ("fmt""path"
)func main() {userPath := "../etc/passwd"cleanedPath := path.Clean(userPath)if path.IsAbs(cleanedPath) || cleanedPath == ".." || cleanedPath == "." {fmt.Println("Invalid path")} else {fmt.Println("Valid path:", cleanedPath)}
}

在这个例子中,我们首先使用path.Clean规范化用户输入的路径,然后检查路径是否为绝对路径或无效路径,防止潜在的安全问题。

限制访问范围

限制访问范围是防止目录遍历攻击的重要措施之一。可以通过将所有路径操作限制在指定的根目录下,实现对路径的访问控制。

package mainimport ("fmt""path/filepath"
)func main() {rootDir := "/safe/root"userPath := "../etc/passwd"safePath := filepath.Join(rootDir, filepath.Clean(userPath))if !filepath.HasPrefix(safePath, rootDir) {fmt.Println("Access denied")} else {fmt.Println("Access allowed:", safePath)}
}

在这个例子中,我们将用户输入的路径与安全根目录结合,并检查最终路径是否仍在根目录内,以防止非法访问。

常见错误及避免方法

在处理路径时,以下是一些常见错误及其避免方法:

忽视路径规范化

忽视路径规范化可能导致路径冗余或错误。应始终使用path.Clean函数规范化路径。

package mainimport ("fmt""path"
)func main() {p := "/a/b/../c/./d"fmt.Println(path.Clean(p)) // 输出: /a/c/d
}
直接拼接用户输入路径

直接拼接用户输入路径可能导致目录遍历攻击,应始终使用filepath.Join函数进行路径拼接。

package mainimport ("fmt""path/filepath"
)func main() {rootDir := "/safe/root"userPath := "../etc/passwd"safePath := filepath.Join(rootDir, filepath.Clean(userPath))fmt.Println("Safe path:", safePath) // 输出: /safe/root/etc/passwd
}
未验证路径合法性

未验证路径合法性可能导致安全问题,应始终检查路径是否在预期的目录范围内。

package mainimport ("fmt""path/filepath"
)func main() {rootDir := "/safe/root"userPath := "../etc/passwd"safePath := filepath.Join(rootDir, filepath.Clean(userPath))if !filepath.HasPrefix(safePath, rootDir) {fmt.Println("Access denied")} else {fmt.Println("Access allowed:", safePath)}
}

通过遵循这些最佳实践和避免常见错误,我们可以在处理路径时提高安全性,防止潜在的安全漏洞。

高级用法与实战案例

在实际项目中,路径处理不仅限于基本的清理、拼接和提取操作,还涉及到更复杂的场景和高级用法。接下来,我们将介绍一些高级用法,并通过实战案例展示如何在项目中应用这些技巧。

高级用法介绍

使用path.Join处理URL路径

在处理网络请求时,我们可能需要拼接多个URL路径片段。虽然path包主要用于文件路径处理,但它同样适用于URL路径。例如:

package mainimport ("fmt""path"
)func main() {baseURL := "http://example.com/api"endpoint := "/v1/resource"fullPath := path.Join(baseURL, endpoint)fmt.Println(fullPath) // 输出: http:/example.com/api/v1/resource
}

需要注意的是,path.Join会处理多个斜杠,因此我们在拼接URL路径时要特别注意路径片段的格式。

动态生成路径

在某些场景下,我们需要根据输入动态生成路径。path包的函数可以帮助我们灵活处理这些需求。例如:

package mainimport ("fmt""path""strconv"
)func generateFilePath(baseDir string, userID int, fileName string) string {userDir := "user" + strconv.Itoa(userID)return path.Join(baseDir, userDir, fileName)
}func main() {baseDir := "/data"userID := 42fileName := "document.txt"filePath := generateFilePath(baseDir, userID, fileName)fmt.Println(filePath) // 输出: /data/user42/document.txt
}

在这个例子中,我们根据用户ID动态生成文件路径,使代码更加灵活和可维护。

实战案例:项目中的路径处理

实战案例1:图片上传路径处理

在一个图片上传服务中,我们需要处理图片的存储路径,确保不同用户上传的图片不会互相覆盖。以下是一个处理图片上传路径的示例:

package mainimport ("fmt""path""time"
)func generateImagePath(baseDir string, userID int, imageName string) string {timestamp := time.Now().Unix()userDir := "user" + fmt.Sprintf("%d", userID)imageDir := fmt.Sprintf("%d", timestamp/86400) // 按天分目录return path.Join(baseDir, userDir, imageDir, imageName)
}func main() {baseDir := "/images"userID := 42imageName := "picture.png"imagePath := generateImagePath(baseDir, userID, imageName)fmt.Println(imagePath) // 输出: /images/user42/18934/picture.png
}

在这个例子中,我们使用时间戳按天分目录存储图片,确保每个用户的图片都有独立的存储路径。

实战案例2:配置文件路径处理

在一个多模块项目中,我们需要处理各个模块的配置文件路径,确保配置文件可以灵活加载。以下是一个处理配置文件路径的示例:

package mainimport ("fmt""path"
)func getConfigFilePath(baseDir, moduleName, fileName string) string {return path.Join(baseDir, "config", moduleName, fileName)
}func main() {baseDir := "/project"moduleName := "moduleA"fileName := "config.yaml"configFilePath := getConfigFilePath(baseDir, moduleName, fileName)fmt.Println(configFilePath) // 输出: /project/config/moduleA/config.yaml
}

在这个例子中,我们为每个模块生成独立的配置文件路径,使配置管理更加灵活和可维护。

实战案例:文件系统操作

实战案例3:批量文件重命名

在一个文件处理工具中,我们可能需要批量重命名文件。以下是一个批量重命名文件的示例:

package mainimport ("fmt""os""path"
)func renameFiles(baseDir string, files []string, newPrefix string) {for _, file := range files {oldPath := path.Join(baseDir, file)newPath := path.Join(baseDir, newPrefix + file)err := os.Rename(oldPath, newPath)if err != nil {fmt.Println("Error renaming file:", err)} else {fmt.Println("Renamed", oldPath, "to", newPath)}}
}func main() {baseDir := "./data"files := []string{"file1.txt", "file2.txt", "file3.txt"}newPrefix := "new_"renameFiles(baseDir, files, newPrefix)
}

在这个例子中,我们通过os.Rename函数批量重命名文件,并使用path.Join生成新的文件路径。

通过这些高级用法和实战案例,我们可以看到path包在实际项目中的广泛应用。掌握这些技巧可以帮助我们更加高效地处理路径相关的任务,提高代码的灵活性和可维护性。

总结与最佳实践

总结文章内容

本文深入探讨了Golang标准库中path包的用法和技巧,主要涵盖以下几个方面:

  1. 基本概念和功能:介绍了path包的基础知识,包括路径的基本概念和常见操作函数,如path.Cleanpath.Joinpath.Split等。
  2. 路径提取与处理:详细讲解了如何使用path.Basepath.Dirpath.Ext等函数提取路径的不同部分,并处理不同操作系统的路径分隔符。
  3. 路径匹配与查找:通过path.Matchfilepath.Glob介绍了路径匹配和查找的功能,以及它们在实际项目中的应用场景。
  4. 路径规范化与安全性:探讨了路径规范化的重要性和安全处理路径的最佳实践,并提供了具体的代码示例来避免常见错误。
  5. 高级用法与实战案例:展示了如何在实际项目中应用path包处理更复杂的路径操作,包括URL路径处理、动态生成路径、图片上传路径处理、配置文件路径处理和批量文件重命名等。

通过这些内容,读者应该能够全面掌握path包的用法,并在实际开发中高效地处理路径相关的任务。

提供路径处理的最佳实践和建议

在实际开发中,路径处理涉及到很多细节和技巧。以下是一些最佳实践和建议,可以帮助开发者更好地管理和处理路径:

  1. 始终使用规范化路径:使用path.Clean函数规范化路径,去除冗余部分,确保路径的唯一性和正确性。

  2. 避免直接拼接用户输入路径:直接拼接用户输入路径可能导致安全问题,应使用filepath.Join进行路径拼接,并验证和清理用户输入。

  3. 限制路径访问范围:在处理文件路径时,应限制访问范围,确保所有路径操作都在指定的根目录内,防止目录遍历攻击。

  4. 处理不同操作系统的路径分隔符:在跨平台开发时,注意处理不同操作系统的路径分隔符,使用filepath.ToSlashfilepath.FromSlash函数进行转换。

  5. 验证路径合法性:在进行路径操作前,验证路径的合法性,确保路径在预期的目录范围内,避免意外的文件访问。

  6. 动态生成路径:根据实际需求动态生成路径,确保路径的灵活性和可维护性。

  7. 使用相对路径和绝对路径的转换:根据实际情况使用相对路径和绝对路径,确保路径的可移植性和正确性。

  8. 处理路径中的特殊字符:注意处理路径中的特殊字符,如空格、中文字符等,确保路径操作的正确性。

结语

通过掌握path包的各种功能和技巧,开发者可以更加高效地处理路径相关的任务,提高代码的可读性和可靠性。无论是处理文件系统操作、解析URL,还是进行网络请求,path包都提供了强大的支持。在实际开发中,遵循最佳实践,可以帮助我们避免常见的路径处理问题,确保代码的安全性和稳定性。

希望本文对您在Golang开发中的路径处理有所帮助。如果您有任何问题或建议,欢迎在评论区留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/415971.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubeadm方式升级k8s集群

一、注意事项 升级前最好备份所有组件及数据,例如etcd 不要跨两个大版本进行升级,可能会存在版本bug,如: 1.19.4–>1.20.4 可以 1.19.4–>1.21.4 不可以 跨多个版本的可以逐个版本进行升级。 二、查看当前版本 [rootk8s…

AI时代的程序员:关于创业、应用开发与快速成长的经验分享 | CSDN杭州线下分享

写在前面 上周六参加了一个CSDN组织的线下技术沙龙,做了一个分享,所以本篇内容对当时分享的内容做一个整理,感谢CSDN平台和鲲志大佬的组织,让大家有了一次深入的沟通交流。 先贴照片留念: 本来是想弄个详细点的逐字稿…

【qt】多线程实现倒计时

1.界面设计 设置右边的intvalue从10开始倒计时 2.新建Thread类 新建Thread类,使其继承QThread类,多态重写run函数,相当于线程执行函数 3.重写run函数 重写run函数,让另一个进程每隔1s发出一个信号,主线程使用conne…

大零售时代:开源 AI 智能名片、2+1 链动与 O2O 商城小程序引领融合新趋势

摘要:本文深入探讨了当今零售业态的发展趋势,指出在数据匹配的时代,人依然在零售中发挥着重要作用。通过对大零售理念的阐述,分析了跨行业跨业态融合的必然性,强调了业态融合的指导思想以及实现方式。同时,…

《OpenCV计算机视觉》—— 对图片的各种操作

文章目录 1、安装OpenCV库2、读取、显示、查看图片3、对图片进行切割4、改变图像的大小5、图片打码6、图片组合7、图像运算8、图像加权运算 1、安装OpenCV库 使用pip是最简单、最快捷的安装方式 pip install opencv-python3.4.2还需要安装一个包含了其他一些图像处理算法函数的…

【教程】MySQL数据库学习笔记(六)——数据查询语言DQL(持续更新)

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 第四章 《数据操…

华为云征文|华为云Flexus X实例docker部署srs6并调优,协议使用webrtc与rtmp

华为云征文|华为云Flexus X实例docker部署srs6并调优,协议使用webrtc与rtmp 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体验跃级、面向中小企业和开发者打造的高品价比云服务产品。Flexus云服务器X实例是新一代面向中小企业…

CRM系统为贷款中介行业插上科技的翅膀

CRM(客户关系管理)系统为贷款中介公司插上了科技的翅膀,极大提升了贷款中介企业的运营效率、客户管理能力和市场竞争力。鑫鹿贷款CRM系统基于互联网、大数据分析、人工智能、云计算等前沿技术,帮助贷款中介公司实现业务流程的自动…

注册安全分析报告:央视网

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

Android 11 (R)AMS Activity内部机制

一、AMS是如何被管理的 如我们在Android 11(R)启动流程中介绍的一样,AMS和ATMS是在SystemServer中被启动的 ActivityTaskManagerService atm mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService(); mActivityManagerSe…

名城优企游学活动走进龙腾半导体:CRM助力构建营销服全流程体系

8月29日,由纷享销客主办的“数字中国 高效增长——名城优企游学系列活动之走进龙腾半导体”研讨会在西安市圆满落幕,来自业内众多领袖专家参与本次研讨会,深入分享交流半导体行业的数字化转型实践,探讨行业数字化、智能化转型之路…

Linux【3】文件目录进阶

目录 cd 回到家目录 在最近两次目录来回切花 相对路径:从当前位置开始,前面没有/ or ~ mkdir rm 不可恢复 删除目录 -f 有则删,无也不报错 ls通配符仍适用!【批量删除】 cd 回到家目录 cd cd ~ 在最近两次目录来回…

Python 数据分析— Pandas 基本操作(上)

文章目录 学习内容:一、Series 创建及操作二、DataFram 的创建与操作三、Pandas 的读写操作四、选择指定行列数据 学习内容: 一、Series 创建及操作 ** Series : Pandas 的一种数据结构形式,可理解为含有索引的一维数组。** **(…

【Altium Designer脚本开发】——PCB平面绕组线圈 V1.4

PCB平面绕组线圈工具用于生成平面电机线圈,应用场景可参考平面电机的书籍、CNKI论文或平面电机的视频。此工具运行环境在Altium Designer中,可用于Altium Designer全系列的版本中。 以下工具可以定制和试用 原理图文档处理工具 ➡️物料编码自动查找工具…

c++ 156函数

inline内联函数 #include<iostream> using namespace std;inline void printA() {int a 10;cout << "a:" << a << endl;}void main() {//printA();//c编译器会这样 把函数体机械地放到main函数里面{int a 10;cout << "a:"…

云计算之ECS

目录 一、ECS云服务器 1.1 ECS的构成 1.2 ECS的实例规格 1.3 镜像 1.4 磁盘 1.5 安全组 1.6 网络 1.7 产品结构 二、块存储介绍 2.1 快存储定义 2.2 块存储性能指标 2.3 快存储常用操作-云盘扩容 2.4 块存储常见问题 三、快照介绍 3.1 快照定义 3.2 快照常见问题…

tomcat架构设计分析,核心组件详解

提示&#xff1a;tomcat整体架构分析&#xff0c;tomcat核心组件详解、tomcat请求全流程、tomcat设计模式分析。责任链模式设计、tomcat设计详解、tomcat调优的前置文档 文章目录 前言一、相关概念1、tomcat的概念2、web应用部署的3种方式 二、tomcat的整体架构1、tomcat架构图…

家教管理系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装家教管理系统软件来发挥其高效地信息处理的作用&#xff0c…

[论文笔记]RAFT: Adapting Language Model to Domain Specific RAG

引言 今天带来一篇结合RAG和微调的论文&#xff1a;RAFT: Adapting Language Model to Domain Specific RAG。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 本文介绍了检索增强微调(Retrieval Augmented Fine Tunin…

Opencv中的直方图(4)局部直方图均衡技术函数createCLAHE()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个指向 cv::CLAHE 类的智能指针并初始化它。 函数原型 Ptr<CLAHE> cv::createCLAHE (double clipLimit 40.0,Size tileGridSize…