我正在Go中运行一个带有语句的测试来打印某些内容(即用于调试测试),但它不打印任何东西.
func TestPrintSomething(t *testing.T) {
fmt.Println("Say hi")
}
Run Code Online (Sandbox Code Playgroud)
当我对这个文件运行go test时,这是输出:
ok command-line-arguments 0.004s
Run Code Online (Sandbox Code Playgroud)
据我所知,真正让它打印的唯一方法是通过t.Error()打印它,如下所示:
func TestPrintSomethingAgain(t *testing.T) {
t.Error("Say hi")
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Say hi
--- FAIL: TestPrintSomethingAgain (0.00 seconds)
foo_test.go:35: Say hi
FAIL
FAIL command-line-arguments 0.003s
gom: exit status 1
Run Code Online (Sandbox Code Playgroud)
我用Google搜索并查看了手册,但没有找到任何内容.
我有一个结构人员.
type Person struct {
Firstname string
Lastname string
Years uint8
}
Run Code Online (Sandbox Code Playgroud)
然后我有这个结构的两个实例,PersonA和PersonB.
PersonA := {"", "Obama", 6}
PersonB := {"President", "Carter", 8}
Run Code Online (Sandbox Code Playgroud)
我想编写一个函数,在给定每个字段的某些条件(即非空)的情况下,将值从PersonA复制到PersonB.我知道如何通过对字段名称进行硬编码来实现这一点,但是我想要一个即使我更改Person结构也能工作的函数.
我知道Go反射是有帮助的,但问题是获取并设置值需要知道类型,如果你想使用像SetInt这样的东西.但有一种"简单"的方法吗?
**Javascript类比**在Javascript中,你可以做一个(在someObject中的属性)循环.
(for propt in personA) {
if personA[propt] != "" {
// do something
personB[propt] = personA[propt]
}
}
Run Code Online (Sandbox Code Playgroud)
我已经排除的选项:
跟踪地图中每个结构中的字段,然后使用反射pkg中的FieldByName和Set*函数集合的组合.
手动创建一个循环遍历Person(下面).因为我想为许多其他结构(学校,动物等)做这种类型的"更新"
if PersonA.Firstname != "" {
PersonB.Firstname = PersonA.Firstname
}
Run Code Online (Sandbox Code Playgroud)
...
if PersonA.Years != "" {
PersonB.Years = PersonA.Years
}
Run Code Online (Sandbox Code Playgroud)下面的问题让我在那里中途,但仍然不能扩展到我想要利用这个"更新"功能的所有结构.
在Golang中,使用reflect,如何设置struct字段的值?
**其他有用的链接** GoLang:按名称访问struct属性
我正在尝试编写一个可以在 Golang 中接收不同自定义类型的辅助函数,但我不知道如何完全按照我想要的方式进行。情况是这样的(顺便说一下,我正在构建一个返回 JSON 对象的 API,它实现了 HAL 协议。这只是意味着资源和关系作为链接返回,而不是简单的 ID')。
我的应用程序中有许多模型,例如学生、校长、学校等……这些模型中的每一个都有许多领域,有些相同,有些不同。理想情况下,我想要一个可以遍历结构的字段并更改结构中的另一个字段的函数。最大的挑战是这些结构可以是学生、校长、学校等类型......
楷模:
type Person struct {
halgo.Links
Id bson.ObjectId
Firstname string
Lastname string
Email string
}
type Student struct {
Person `bson:",inline"`
School mgo.DBRef
}
type School struct {
Id bson.ObjectId
Address []string
Name string
Description string
}
Run Code Online (Sandbox Code Playgroud)
然后,我想要一个函数,它基本上可以采用这些结构中的任何一个,遍历字段(使用reflect),并对每个字段执行某些操作。
我试过一个函数,interface{}但问题是你必须对参数进行类型断言才能访问任何字段。即使有了它,您仍然必须为每种类型/模型编写单独的函数。:
func GenerateLinksHelper(m interface{}) {
...
}
Run Code Online (Sandbox Code Playgroud)
最终,我试图找到一种方法来编写一个函数,该函数接受一个有点任意的结构并对可能存在或不存在的字段执行操作。