2 回答

TA貢獻1900條經驗 獲得超5個贊
您britishAmerican在 init 函數中更改變量。如果沒有init(),程序會在當前目錄中查找(沒有給出路徑,只有文件名)。使用init(),它會在可執行文件所在的路徑中查找 ( os.Args[0])。使用go run main.go,可執行文件所在的目錄不是當前工作目錄。
您應該使用go build來構建二進制文件然后運行它,或者您應該告訴我們您想要實現的目標(如@RoninDev 所寫)。
我提到的 MCVE 可能如下所示:
package main
import (
"io/ioutil"
"log"
"os"
"path/filepath"
)
var filename = "foo.txt"
func init() {
// change to true and things break
if false {
dir, _ := filepath.Split(os.Args[0])
filename = filepath.Join(dir, filename)
}
}
func main() {
// requires a file 'foo.txt' in the current directory
_, err := ioutil.ReadFile(filename)
if err != nil {
log.Fatal(err)
}
}
它(當然)可以更短,但這應該足以讓社區中的其他人了解正在發生的事情。

TA貢獻1799條經驗 獲得超8個贊
在我看來,程序british-american.txt
需要在可執行文件所在的目錄中調用一個文件。
這就是其中的代碼init()
所做的 - 它找到可執行文件的路徑并構造一個相對于該字典的路徑。
我可以從您的錯誤消息中看到您go run
用于運行代碼。這會生成一個臨時可執行文件/tmp
并運行它。如果您將init()
代碼保留在其中,它將在/tmp
目錄中查找字典,但不會找到它。如果你把init()
代碼拿出來,它會在當前目錄中查找字典,它會成功。
如果你想按照作者的意圖使用它,那么使用它go build
來構建一個二進制文件然后運行它 - 這會起作用。
- 2 回答
- 0 關注
- 324 瀏覽
添加回答
舉報