Go调用filepath.Join报错 如何实现带默认父目录的路径拼接
Go 实现带默认父目录的filepath.Join路径拼接方案
问题复现
尝试封装带固定父目录的路径拼接函数时,触发编译错误,复现代码如下:
package main import ( "fmt" "path/filepath" ) func main() { myVal := joinPath("dir1", "dir2") fmt.Println(myVal) } func joinPath(dirs ...string) string { return filepath.Join("mydir", dirs...) }
对应报错信息:
./prog.go:16:32: too many arguments in call to filepath.Join have (string, []string) want (...string)
报错原因
Go 可变参数语法不允许在函数调用时,混合传入普通固定位置参数和...展开的切片类型参数。上述代码中filepath.Join("mydir", dirs...)同时传入了固定字符串参数和展开的字符串切片,不符合语法要求,因此触发编译报错。
正确实现方法
先将固定父目录和传入的可变路径参数合并为同一个字符串切片,再将切片整体展开传入filepath.Join即可,修正后全版本兼容的代码如下:
package main import ( "fmt" "path/filepath" ) func main() { myVal := joinPath("dir1", "dir2") fmt.Println(myVal) // 类Unix系统输出: mydir/dir1/dir2 // Windows系统自动适配分隔符输出: mydir\dir1\dir2 } func joinPath(dirs ...string) string { // 把默认父目录作为切片第一个元素,追加传入的所有路径参数 pathParts := append([]string{"mydir"}, dirs...) return filepath.Join(pathParts...) }
补充说明
filepath.Join会自动清理路径中的多余分隔符、处理../这类相对路径跳转,不需要额外做字符串替换处理。- 如果需要多层固定父目录,只需要在初始化切片时按顺序添加即可,例如
append([]string{"root", "default", "mydir"}, dirs...)就会以root/default/mydir作为固定前缀拼接后续路径。
内容的提问来源于stack exchange,提问作者Alwin Doss
相关产品推荐
相关产品推荐

