我正在研究 Project Euler 問題以適應 Go。問題不是關于 Project Euler,而是在這個問題中有 Project Euler 特定的代碼,可能會泄露問題的挑戰(zhàn)。“劇透警報”或其他什么,但現(xiàn)在你知道了。這是我的文件結(jié)構(gòu):+ Project Euler+-+ Go <= GOPATH set here +-+ src +-+ util | +- util.go | +- 001.go +- 002.go ... +- 023.go對于問題 23,我SumOfDivisors向 util.go(一個包含多個問題使用的各種方法的文件)添加了一個新函數(shù):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當我調(diào)用go run 023.go. “看起來很好”意味著除了我的代碼之外沒有錯誤、警告和輸出。打印到屏幕的時間是1應該的16。我不認為這是一個邏輯問題,因為當我將函數(shù)從 util.go 復制到 023.go(并將對 GetPrimeFactors 的調(diào)用修復為 util.GetPrimeFactors)時,該函數(shù)運行得很好并像它應該的那樣打印 16 . 我試過添加fmt.Println("TEST"),util.SumOfDivisors但它不會打印出這些語句,我也沒有收到錯誤或其他任何信息。如果我將函數(shù)的名稱更改util.go為其他任何名稱,即使主函數(shù)023.go沒有更改,它仍然會構(gòu)建并運行輸出1. 行為真的很奇怪。我的 util.go 文件中的其他函數(shù)似乎被調(diào)用得很好。我正在運行 Go 1.4.2。什么可能導致這種行為?該功能在本地正常工作,但在移動到導入的外部文件時無法正常工作,為什么該外部文件無法將任何內(nèi)容打印到屏幕上?所有這一切同時構(gòu)建得很好。
2 回答

瀟瀟雨雨
TA貢獻1833條經(jīng)驗 獲得超4個贊
用 go build -a 023.go
這將重建 023.go 擁有的所有依賴項,并避免使用舊的編譯版本的包。這是 Go 的強項之一,可以縮短構(gòu)建時間,但它也可能導致這些類型的問題。
正如我在評論中提到的,您一直在構(gòu)建 023.go,但您可能沒有運行go build util.go
更新 023.go 所依賴的 util 包。
-a 選項將重建所有依賴項,您甚至可以添加-v
以查看它正在構(gòu)建的內(nèi)容和時間。
go build -a -v 023.go
或者
go run -a -v 023.go
運行、構(gòu)建、清理和測試具有類似的標志。運行go help build
以獲取更多信息。

函數(shù)式編程
TA貢獻1807條經(jīng)驗 獲得超9個贊
經(jīng)過一番折騰,我發(fā)現(xiàn)里面有一個/Project Euler/pkg
文件夾util.a
。顯然,我構(gòu)建了一個版本的代碼,并且緩存了它的中間文件。
刪除 pkg 文件夾后,一切就都到位了。不匹配的函數(shù)名變成了編譯器錯誤,然后(在更正函數(shù)名之后)我的 util.gofmt.Println
調(diào)用開始打印,我的答案是16
. 最后,這不是代碼解決方案,而是緩存問題。
- 2 回答
- 0 關注
- 184 瀏覽
添加回答
舉報
0/150
提交
取消