亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中的文件路徑

Go 中的文件路徑

Go
嚕嚕噠 2021-09-13 14:41:22
這是 Mark Summerfield 編寫的 Programming in Go 中的示例。package mainimport ("fmt""io/ioutil""os""path/filepath""strings")var britishAmerican = "british-american.txt"func init() {    dir, _ := filepath.Split(os.Args[0])    britishAmerican = filepath.Join(dir, britishAmerican)}func main() {    rawBytes, err := ioutil.ReadFile(britishAmerican)    if err != nil {        fmt.Println(err)    }    text := string(rawBytes)    usForBritish := make(map[string]string)    lines := strings.Split(text, "\n")    fmt.Println(lines)    for _, line := range lines {        fields := strings.Fields(line)        if len(fields) == 2 {            usForBritish[fields[0]] = fields[1]        }    }    fmt.Println(usForBritish)}當我在注釋掉 init() func 的情況下運行此代碼時,它運行良好。如果我把它留在我得到這個錯誤:open /var/folders/l6/rdqtyrfd303dw1cz8qvlfcvc0000gn/T/go-    build652175567/command-line-arguments/_obj/exe/british-american.txt: no     such file or directory exit status 1  我的問題是,為什么init()func 不從適當的目錄中獲取文件?
查看完整描述

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)

    }

}

它(當然)可以更短,但這應該足以讓社區中的其他人了解正在發生的事情。


查看完整回答
反對 回復 2021-09-13
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

在我看來,程序british-american.txt需要在可執行文件所在的目錄中調用一個文件。

這就是其中的代碼init()所做的 - 它找到可執行文件的路徑并構造一個相對于該字典的路徑。

我可以從您的錯誤消息中看到您go run用于運行代碼。這會生成一個臨時可執行文件/tmp并運行它。如果您將init()代碼保留在其中,它將在/tmp目錄中查找字典,但不會找到它。如果你把init()代碼拿出來,它會在當前目錄中查找字典,它會成功。

如果你想按照作者的意圖使用它,那么使用它go build來構建一個二進制文件然后運行它 - 這會起作用。


查看完整回答
反對 回復 2021-09-13
  • 2 回答
  • 0 關注
  • 324 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號