【发布时间】:2021-02-14 10:41:01
【问题描述】:
我正在用 Golang 编写一个基本程序,它输出当前目录中的文件数以及每个文件包含多少行代码:
我现在正在尝试对具有相同扩展名的文件进行分组,但遇到了问题。 所以,我所做的是将字符串映射声明为键,将字符串切片声明为值:
将 extname 存储为密钥,并将其文件存储在该切片中
var m = make(map[string][]string)
我首先在“组”函数中收到程序读取的文件片段(q 参数),如下所示:
[.gitignore README.md cmd\root.go example.go eyeball.exe go.mod go.sum main.go utils\utils.go]
然后我对该片文件进行操作:
func group(q []string) {
var ext string
var checkedext []string
for _, val := range q {
ext = strings.Split(val, ".")[1]
for _, foo := range q {
secext := strings.Split(foo, ".")[1]
if ext == secext {
if !contains(checkedext, ext) {
addtogroup(ext, foo)
checkedext = append(checkedext, ext)
}
}
}
}
fmt.Println(m)
}
func contains(s []string, item string) bool {
for _, el := range s {
if el == item {
return true
}
}
return false
}
var m = make(map[string][]string)
func addtogroup(ext, file string) {
var subgroup []string
if val, ok := m[ext]; ok {
val = append(val, file)
} else {
subgroup = append(subgroup, file)
m[ext] = subgroup
}
}
当我打印地图时,它会输出:
map[exe:[eyeball.exe] gitignore:[.gitignore] go:[cmd\root.go] md:[README.md] mod:[go.mod] sum:[go.sum]]
但是,上面的输出是错误的,因为我有 3 个 .go 文件。
我知道范围会遍历地图的副本,我无法通过指针引用它,因为地图本身就是一个引用,我找不到解决方法, 我想做这个:
var m = make(map[string]*Data)
但我不知道这是否是最好的做法
我努力解释我想让我的程序做什么以及它做了什么,如果我遗漏了任何细节,请指出我。
【问题讨论】:
标签: dictionary go slice