>

여러 패키지의 단위 테스트에서 사용되는 단위 테스트를위한 유틸리티 함수를 작성 중입니다. 이 유틸리티 함수는 특정 파일 (항상 동일한 파일)을 읽어야합니다. 내가 찾고있는 것과 이유를 설명하기 위해 작동하지 않는 세 가지 솔루션이 있습니다.

<올>
  • 절대 경로를 하드 코드하십시오. 프로젝트를 테스트하려는 다른 사용자가 절대 경로에서 다른 접두사를 가질 수 있기 때문에 실패합니다.

  • 유틸리티 기능을 정의하는 파일 경로에서 상대 경로를 하드 코드하십시오. 이 함수를 가져오고 사용하는 패키지가 유틸리티 함수를 정의하는 파일과 파일 계층 구조의 레벨과 같지 않아도되며 상대 경로는 가져 오기가 아닌 가져 오기 프로그램을 기준으로 해석되기 때문에 실패합니다.

  • 모든 발신자의 파일에 대한 상대 경로에서 발신자의 패키지를 기준으로 전달합니다. 실제로는 작동하지만 모든 발신자가 하나의 파일을 전달하도록 변경해야하기 때문에 매우 장황한 것 같습니다.

  • 네번째 해결책이 있는데, 최상위 패키지의 루트 디렉토리에 상대적인 유틸리티 함수의 경로를 하드 코딩 할 수있다. 그러나 루트에서 가져 오기를 해결할 수 있기 때문에 루트 디렉토리가있는 것으로 생각되지만 루트 디렉토리를 코드로 가져 오는 방법을 찾지 못했습니다.

    따라서 원하는 루트 디렉토리를 어떻게 얻을 수 있습니까?

    다양한 Go 문서를 살펴 보았지만 지금까지 해결책을 찾지 못했습니다. 이 질문 도 보았습니다. 해결책은 위의 # 3과 같습니다.


    • 답변 # 1

      C 없이도 내 방법을 사용할 수 있습니다 :

      package mypackage
      import (
          "path/filepath"
          "runtime"
          "fmt"
      )
      var (
          _, b, _, _ = runtime.Caller(0)
          basepath   = filepath.Dir(b)
      )
      func PrintMyPath() {
          fmt.Println(basepath)
      }
      
      

      https://play.golang.org/p/ifVRIq7Tx0

    • 답변 # 2

      예, 패키지 경로 찾기가 가능합니다 :

      pathfind.go :

      package main
      /*
      const char* GetMyPathFILE = __FILE__;
      */
      import "C"
      import "path/filepath"
      var basepath = ""
      //GetMyPath Returns the absolute directory of this(pathfind.go) file
      func GetMyPath() string {
          if basepath == "" {
              g := C.GoString(C.GetMyPathFILE)
              basepath = filepath.Dir(g)
          }
          return basepath
      }
      
      

      이 파일을 프로젝트에 복사하기 만하면됩니다. 이것은 호출자가 아닌 파일의 경로와 함께 제공되므로 함수/파일을 함수가 필요한 모든 프로젝트에 복사해야합니다. 또한이 코드를 다른 코드와 함께 파일에 넣으면 CGO 를 존중해야합니다 수입 규칙.

  • 이전 casting - pyspark - 열을 문자열 유형에서 타임 스탬프 유형으로 변환
  • 다음 c++ - 최고의 크로스 플랫폼 (휴대용) 임의 정밀도 수학 라이브러리