可以使用标准库中的 path 包来实现路径判断。
示例代码如下:
package main
import (
"fmt"
"path/filepath"
"strings"
)
func isSubPath(parent, child string) bool {
parentAbs, err := filepath.Abs(parent)
if err != nil {
return false
}
childAbs, err := filepath.Abs(child)
if err != nil {
return false
}
// convert to lowercase for Windows case-insensitivity
parentAbs = strings.ToLower(parentAbs)
childAbs = strings.ToLower(childAbs)
rel, err := filepath.Rel(parentAbs, childAbs)
if err != nil || rel == ".." || strings.HasPrefix(rel, "../") {
return false
}
return true
}
func main() {
fmt.Println(isSubPath("D:/parent", "D:/parent/sub/child")) // should print true
fmt.Println(isSubPath("D:/foo/bar", "D:/foo/baz")) // should print false
}
该函数首先将两个路径转换为绝对路径,并将它们都转换为小写字母以支持 Windows 的大小写不敏感。然后,使用 filepath.Rel()
函数计算子路径相对于父路径的相对路径,并检查是否以 ..
或 ../
开头,如果是则说明子路径不在父路径内。最后返回布尔值。
注意,在 Windows 系统上,路径分隔符为 \
,但在 Go 中,路径分隔符为 /
,因此在计算相对路径时,需要使用 filepath.Rel()
函数而不是手动拼接路径。