我正在为我的单元测试编写一个实用函数,该函数由多个包中的单元测试使用。此实用程序函数必须读取特定文件(始终是同一文件)。这里有三个不起作用的解决方案,来解释我在寻找什么以及为什么。
>
对绝对路径进行硬编码。这会失败,因为尝试测试项目的另一个用户可能在绝对路径上具有不同的前缀。
硬编码定义实用程序函数的文件路径中的相对路径。这会失败,因为导入和使用此功能的包不一定与定义实用程序功能的文件处于相同的文件层次结构级别,并且相对路径是相对于导入程序而不是导入的文件进行解释的。
传入每个调用者相对于调用者包的文件的相对路径。这实际上有效,但似乎非常冗长,因为现在必须更改每个调用者以传递一个文件。
我看到了第四种解决方案,通过它,我可以在实用程序函数中硬编码一条路径,该路径相对于顶级包的根目录。然而,我还没有找到在代码中获取根目录的方法,尽管我怀疑有一种方法,因为可以从根目录解析导入。
因此,我如何获得广受欢迎的根目录?
我查看了各种Go文档,但迄今为止未能找到解决方案。我也看到了这个问题,但那里的解决方案相当于上面的#3。
返回应用程序的根:
import (
"path"
"path/filepath"
"runtime"
)
func RootDir() string {
_, b, _, _ := runtime.Caller(0)
d := path.Join(path.Dir(b))
return filepath.Dir(d)
}
基于Oleksiy的回答,您可以在项目中创建一个名为的子包。/内部/项目路径/projectpath.go
并粘贴以下内容:
package projectpath
import (
"path/filepath"
"runtime"
)
var (
_, b, _, _ = runtime.Caller(0)
// Root folder of this project
Root = filepath.Join(filepath.Dir(b), "../..")
)
然后可以使用projectpath。在任何其他包中创建根目录,以获得项目的根文件夹。
您也可以在不使用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
问题内容: 我正在尝试学习Go并遵循现有的约定,但是,作为每个约定,您都需要先了解它们,然后才能很好地使用它们,经过一些研究,我没有找到以下问题的确切答案: 我已经在自己的内部建立了一个类似以下结构的项目: 我的主要是: 因此,问题是: 我读到我需要在每个package文件夹中都有一个文件,对吗? 如果是这样,在内部,我将如何导入,以及? 然后,是否可能会有类似的内容: …并且主要是做什么的? 问
问题内容: 在Go中获取当前时间戳并将其转换为字符串的最佳方法是什么?我需要日期和时间。YYYYMMDDhhmmss格式。 问题答案: 使用功能和方法。 打印出来,或者至少在几分钟前完成。(我在东部夏令时。)在时间包中定义的常量中有几种预定义的时间格式。 如果您希望使用UTC而非本地时区,则可以使用。
主要内容:定义字符串,字符串拼接符“+”,字符串实现基于 UTF-8 编码,定义多行字符串一个字符串是一个不可改变的字节序列,字符串可以包含任意的数据,但是通常是用来包含可读的文本,字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码表上的字符时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。 UTF-8 是一种被广泛使用的编码格式,是文本文件的标准编码,其中包括 XML 和 JSON 在内也都使用该编码。由于该编码对占用字节长度的不定性,在Go语言中字符串也可能
X2.2.0新增 sp_check_lang() 功能: 判断当前的语言包,并返回语言包名 参数: 无 返回: 类型string 包名,如:zh-cn 使用: $lang=sp_check_lang();
在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go Hello World 实例 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释 接下来让我们来看下简单的代码,该代码输出了"Hello World!": package main import "fmt" func main() { /* 这是我的
问题内容: Go语言是否像Java一样对字符串使用写时复制?也就是说,如果我按值将字符串传递给方法并且从未更改,则它将分配内存并复制字符串(这将节省时间),或者仅引用单个副本。 问题答案: 它不是写时复制的,因为字符串是不可变的。但是共享一个字符串也不会复制基础内存区域。在Go中,字符串表示为(长度,数据)对。如果传递字符串,Go将复制长度和指针,但不复制所指向的数据。 有关更多信息,请参阅gol