英文:
how to understand golang "non-Separator characters" at path.Match
问题
当我使用golang的embed包时,我对路径匹配感到困惑。*
代表什么?
官方称之为非分隔符字符
在这里:https://pkg.go.dev/path/filepath#Match
'*'匹配任何非分隔符字符的序列
起初,我理解为非分隔符字符
指的是正斜杠(前导斜杠/
),但下面的示例表明情况并非如此。
# 目录树
├── stubs
│ ├── hello.txt
│ └── xyz
│ └── zyx.txt
└── hello.go
# hello.go的源文件
package main
import "embed"
//go:embed stubs/*
var T1 embed.FS
//go:embed stubs*
var T2 embed.FS
func main() {
s, e := T1.ReadFile("stubs/hello.txt")
fmt.Println(string(s))
fmt.Println(e)
s, e = T2.ReadFile("stubs/xyz/zyx.txt")
fmt.Println(string(s))
fmt.Println(e)
}
然后运行go run hello.go
将成功执行。
这个例子告诉我*
可以匹配/
。
非分隔符字符
是什么意思?
感谢解释。
英文:
When I use golang's embed package, I encounter confusion about path matching. that's what *
refers to?
Officially called non-Separator characters
Here: https://pkg.go.dev/path/filepath#Match
'*' matches any sequence of non-Separator characters
At first I understood non-Separator characters
meant forward slashes(leading slash /
), but the following example shows that this is not the case.
# dir tree
├── stubs
│   ├── hello.txt
│   └── xyz
│   └── zyx.txt
└── hello.go
# source file for hello.go
package main
import "embed"
//go:embed stubs/*
var T1 embed.FS
//go:embed stubs*
var T2 embed.FS
func main() {
s, e := T1.ReadFile("stubs/hello.txt")
fmt.Println(string(s))
fmt.Println(e)
s, e = T2.ReadFile("stubs/xyz/zyx.txt")
fmt.Println(string(s))
fmt.Println(e)
}
Then run go run hello.go
will execute successfully.
This case tell me *
can match /
.
what does non-Separator characters
mean?
Thanks for the explanation.
答案1
得分: 1
T2.ReadFile("stubs/xyz/zyx.txt")
的工作原理与你想的不同。
go:embed
的文档解释如下:
如果模式指定一个目录,那么以该目录为根的子树中的所有文件都会被嵌入(递归地),但以'.'或'_'开头的文件会被排除。
https://pkg.go.dev/embed#hdr-Directives
你将T2
声明为:
//go:embed stubs*
var T2 embed.FS
模式stubs*
匹配目录stubs
,所以整个目录stubs
,包括其中的所有文件(递归地),都会被包含在T2
文件系统中。
英文:
T2.ReadFile("stubs/xyz/zyx.txt")
works for a different reason than you think.
The documentation for go:embed
explains:
> If a pattern names a directory, all files in the subtree rooted at
> that directory are embedded (recursively), except that files with
> names beginning with ‘.’ or ‘_’ are excluded.
https://pkg.go.dev/embed#hdr-Directives
You have declared T2
as:
//go:embed stubs*
var T2 embed.FS
The pattern stubs*
matches the directory stubs
, so the whole directory stubs
, including all files in it (recursively) are included in the T2
filesystem.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论