为了账号安全,请及时绑定邮箱和手机立即绑定

从外部文件导入时功能不正常,但在同一文件中时正常?

从外部文件导入时功能不正常,但在同一文件中时正常?

Go
慕慕森 2021-09-27 16:08:50
我正在研究 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以获取更多信息。


查看完整回答
反对 回复 2021-09-27
?
函数式编程

TA贡献1807条经验 获得超9个赞

经过一番折腾,我发现里面有一个/Project Euler/pkg文件夹util.a。显然,我构建了一个版本的代码,并且缓存了它的中间文件。

删除 pkg 文件夹后,一切就都到位了。不匹配的函数名变成了编译器错误,然后(在更正函数名之后)我的 util.gofmt.Println调用开始打印,我的答案是16. 最后,这不是代码解决方案,而是缓存问题。


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信