我正在研究 Project Euler 问题以适应 Go。问题不是关于 Project Euler,而是在这个问题中有 Project Euler 特定的代码,可能会泄露问题的挑战。“剧透警报”或其他什么,但现在你知道了。这是我的文件结构:+ Project Euler+-+ Go <= GOPATH set here +-+ src +-+ util | +- util.go | +- 001.go +- 002.go ... +- 023.go对于问题 23,我SumOfDivisors向 util.go(一个包含多个问题使用的各种方法的文件)添加了一个新函数:func GetPrimeFactors(val int) map[int]int { primes := map[int]int{} init := val num := 2 for val > 1 { if (val % num) == 0 { if num == init { return nil } _, e := primes[num] if e { primes[num]++ } else { primes[num] = 1 } val /= num } else { num++ } } return primes}func SumOfDivisors(val int) int { primes := GetPrimeFactors(val) if primes == nil { if val == 0 { return 0 } else { return 1 } } total := 1 for k, v := range primes { if v > 1 { n := int((math.Pow(float64(k), float64(v+1)) - 1) / float64(k-1)) total *= n } else { n := k + 1 total *= n } } return total - val}为了测试这个方法,我在023.go里面写了这个基本的Go:package mainimport ( "fmt" "util")func main() { fmt.Println(util.SumOfDivisors(12))}我有我的GOPATH设置,/Project Euler/Go当我调用go run 023.go. “看起来很好”意味着除了我的代码之外没有错误、警告和输出。打印到屏幕的时间是1应该的16。我不认为这是一个逻辑问题,因为当我将函数从 util.go 复制到 023.go(并将对 GetPrimeFactors 的调用修复为 util.GetPrimeFactors)时,该函数运行得很好并像它应该的那样打印 16 . 我试过添加fmt.Println("TEST"),util.SumOfDivisors但它不会打印出这些语句,我也没有收到错误或其他任何信息。如果我将函数的名称更改util.go为其他任何名称,即使主函数023.go没有更改,它仍然会构建并运行输出1. 行为真的很奇怪。我的 util.go 文件中的其他函数似乎被调用得很好。我正在运行 Go 1.4.2。什么可能导致这种行为?该功能在本地正常工作,但在移动到导入的外部文件时无法正常工作,为什么该外部文件无法将任何内容打印到屏幕上?所有这一切同时构建得很好。
2 回答
潇潇雨雨
TA贡献1833条经验 获得超4个赞
用 go build -a 023.go
这将重建 023.go 拥有的所有依赖项,并避免使用旧的编译版本的包。这是 Go 的强项之一,可以缩短构建时间,但它也可能导致这些类型的问题。
正如我在评论中提到的,您一直在构建 023.go,但您可能没有运行go build util.go
更新 023.go 所依赖的 util 包。
-a 选项将重建所有依赖项,您甚至可以添加-v
以查看它正在构建的内容和时间。
go build -a -v 023.go
或者
go run -a -v 023.go
运行、构建、清理和测试具有类似的标志。运行go help build
以获取更多信息。
函数式编程
TA贡献1807条经验 获得超9个赞
经过一番折腾,我发现里面有一个/Project Euler/pkg
文件夹util.a
。显然,我构建了一个版本的代码,并且缓存了它的中间文件。
删除 pkg 文件夹后,一切就都到位了。不匹配的函数名变成了编译器错误,然后(在更正函数名之后)我的 util.gofmt.Println
调用开始打印,我的答案是16
. 最后,这不是代码解决方案,而是缓存问题。
- 2 回答
- 0 关注
- 168 浏览
添加回答
举报
0/150
提交
取消