如何使用Golang从一个函数返回不同类型的结构?

如何使用Golang从一个函数返回不同类型的结构?,go,Go,我有一个查询数据库的函数,然后,根据它的结果,可以创建一个结构OrderWithoutDetails或OrderWithDetails,这取决于是否存在有关订单的详细信息 如何使函数能够返回这两种类型的结果?您可以使用接口{} func queryDb() interface{}{ } 但是更好的是,如果你的2类结构可以有一个公共函数,可以满足一个公共接口,它会更干净。 例如: type s1 struct{ id int name string } type s2 struct{

我有一个查询数据库的函数,然后,根据它的结果,可以创建一个结构
OrderWithoutDetails
OrderWithDetails
,这取决于是否存在有关订单的详细信息


如何使函数能够返回这两种类型的结果?

您可以使用
接口{}

func queryDb() interface{}{

}
但是更好的是,如果你的2类结构可以有一个公共函数,可以满足一个公共接口,它会更干净。 例如:

type s1 struct{
  id int
  name string
}

type s2 struct{
  id int
  age int
}

type reDB interface {
  my_print()
}

func (r *s1) my_print(){
  fmt.Print(s1.id)
}

func (r *s2) my_print(){
  fmt.Print(s1.id)
}

func queryDb() reDB{
 ...
}

您可以使用
接口{}

func queryDb() interface{}{

}
但是更好的是,如果你的2类结构可以有一个公共函数,可以满足一个公共接口,它会更干净。 例如:

type s1 struct{
  id int
  name string
}

type s2 struct{
  id int
  age int
}

type reDB interface {
  my_print()
}

func (r *s1) my_print(){
  fmt.Print(s1.id)
}

func (r *s2) my_print(){
  fmt.Print(s1.id)
}

func queryDb() reDB{
 ...
}

取决于什么,你是否会得到细节?如果您知道在调用函数时,最好有两个不同的函数。如果不是,并且OrderWith/WithoutDetails几乎相同,则可以编写一个函数func findOrder(Order,*[]Detail,error),返回details或nil。您还可以订购*详细信息。返回接口{}也很好,或者更好的接口,它返回您的详细信息?如果您知道在调用函数时,最好有两个不同的函数。如果不是,并且OrderWith/WithoutDetails几乎相同,则可以编写一个函数func findOrder(Order,*[]Detail,error),返回details或nil。您还可以订购*详细信息。返回接口{}也很好,或者更好的接口,它返回您的详细信息。围棋用的是骆驼套,不是蛇套。这一点尤其重要,因为在您的示例中,接口
reDB
和其中的
my_print()
函数没有导出,因此无法在定义包之外访问。是的,我知道对于
CamelCase
,我很快就写了,我从C开始练习。但这与导出与否无关,只有第一个字母与此有关,
CamelCase
不是
PascalCase
。另外,这里我们不关心导出与否,也许他不想导出这些func/var;)名称中的下划线在Go中不惯用。围棋用的是骆驼套,不是蛇套。这一点尤其重要,因为在您的示例中,接口
reDB
和其中的
my_print()
函数没有导出,因此无法在定义包之外访问。是的,我知道对于
CamelCase
,我很快就写了,我从C开始练习。但这与导出与否无关,只有第一个字母与此有关,
CamelCase
不是
PascalCase
。另外,这里我们不关心导出与否,也许他不想导出这些func/var;)