gpt4 book ai didi

go - 在结构中使用 map 的更好方法? Go编程语言练习1.4

转载 作者:IT王子 更新时间:2023-10-29 01:47:37 25 4
gpt4 key购买 nike

我正在做 The Go Programming Language 中的练习 1.4。该程序读取标准输入或作为参数给出的文件,并输出具有重复的行。

我有工作代码,我只是想知道是否有更好的方法在结构中使用映射?现在,当找到唯一的行时,我在结构中制作了一张新 map 。但这看起来很笨拙,我想知道我是否应该用另一种方式来解决这个问题。

type dupCount struct {
count int
fileCount map[string]int
}

func main() {
counts := make(map[string]dupCount)
files := os.Args[1:]
if len(files) == 0 {
countLines(os.Stdin, counts, "stdin")
} else {
for _, arg := range files {
f, err := os.Open(arg)
if err != nil {
fmt.Fprintf(os.Stderr, "dup2: %v\n", err)
continue
}
countLines(f, counts, arg)
f.Close()
}
}
func countLines(f *os.File, counts map[string]dupCount, filename string) {
input := bufio.NewScanner(f)
for input.Scan() {
var tmp = counts[input.Text()]
if tmp.count == 0 {
tmp.fileCount = make(map[string]int)
}
tmp.count++
tmp.fileCount[filename]++
counts[input.Text()] = tmp
}
}

我在 countLines 中使用 tmp 变量来解决无法直接分配给 map 中的值的问题 as outlined in the Go Github repo .

最佳答案

我不认为它特别困惑,但我可能会想制作某种 addDupe 辅助函数,它按值获取 dupCount,进行任何更改需要添加行并按值返回 dupCount

func addDupe(dupes dupCount, filename string) dupCount {
if dupes.count == 0 {
dupes.fileCount = make(map[string]int)
}
dupes.fileCount[filename]++
dupes.count++
return dupes
}

这类似于 slice 的标准 append 函数的工作方式。那么countLines可以写成:

func countLines(r io.Reader, counts map[string]dupCount, filename string) {
input := bufio.NewScanner(r)
for input.Scan() {
line := input.Text()
counts[line] = addDupe(counts[line], filename)
}
}

但我所做的只是用一个函数参数替换你的tmp

关于go - 在结构中使用 map 的更好方法? Go编程语言练习1.4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42633651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com