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

我正在研究 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 main


import (

    "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。什么可能导致这种行为?该功能在本地正常工作,但在移动到导入的外部文件时无法正常工作,为什么该外部文件无法将任何内容打印到屏幕上?所有这一切同时构建得很好。


慕慕森
浏览 169回答 2
2回答

潇潇雨雨

用&nbsp;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以获取更多信息。

函数式编程

经过一番折腾,我发现里面有一个/Project Euler/pkg文件夹util.a。显然,我构建了一个版本的代码,并且缓存了它的中间文件。删除 pkg 文件夹后,一切就都到位了。不匹配的函数名变成了编译器错误,然后(在更正函数名之后)我的 util.gofmt.Println调用开始打印,我的答案是16.&nbsp;最后,这不是代码解决方案,而是缓存问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go