2015-01-29 1 views
0

이것은 Mark Summerfield에서의 프로그래밍의 예입니다.Go to FilePaths

package main 

import (
"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) 
} 

이 코드를 주석으로 실행하면, 완벽하게 정상적으로 작동합니다.

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 않습니다한다 : 나는 그것을 떠날 경우이 오류가?

+3

이 코드에서'go fmt'를 실행하면 읽는 것이 더 쉬울 것입니다. [놀이터] (https://play.golang.org/)에서도이 작업을 수행 할 수 있습니다. - 또한 MCVE (https://stackoverflow.com/help/mcve 참조)를 만드는 데 도움이됩니다. – topskip

+0

포맷 오류로 불편을 끼쳐 드려 죄송합니다. 여기 놀이터에 있습니다 https://play.golang.org/p/G8cUb6fZC9 – Deliri

+2

게시물을 편집하면 독자가 쉽게 읽을 수 있습니다 (링크를 따를 필요가 없습니다) – topskip

답변

3

init 함수에서 변수 britishAmerican을 변경합니다. init()이 없으면 프로그램은 현재 디렉토리를 찾습니다 (지정된 경로가없고 파일 이름 만). init()으로 실행 파일이 (os.Args[0]) 인 경로를 찾습니다. go run main.go을 사용하면 실행 파일이있는 디렉토리가 현재 작업 디렉토리가 아닙니다.

go build을 사용하여 바이너리를 빌드 한 다음 실행하거나 @RoninDev에서 작성한대로 달성하고자하는 것을 알려야합니다.

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) 
    } 
} 

이 할 수있는 (물론)도 짧아 질 수 있지만, 이것은 무엇을 볼 수있는 지역 사회에서 다른 사람에 대한 충분해야한다 : 내가 언급 한


MCVE는 다음과 같이 수 계속. .

2
그것은 프로그램이 실행 파일이있는 디렉토리에 british-american.txt라는 파일을 기대하고있다처럼 나에게 보이는

init()의 코드가 무엇을하는지 즉 -는 실행 파일의 경로를 찾아 경로를 구성 그것과 관련된 사전에.

오류 메시지에서 go run을 사용하여 코드를 실행할 수 있습니다. 임시 실행 파일을 /tmp으로 만들고 실행합니다. init() 코드를 남겨두면 /tmp 디렉토리에있는 사전을 찾지 만 찾을 수 없습니다. init() 코드를 제거하면 현재 디렉토리에서 사전을 찾게되고 성공합니다.

작성자로 사용하려면 go build을 사용하여 바이너리를 작성한 다음 실행하십시오. - 작동합니다.

관련 문제