是否可以在下面的函数定义中接受任何类型的结构?
我试图像这样重构:
// This method should accept any type of struct
// Once I receive my response from the database,
// I scan the rows to create a slice of type struct.
func generateResponse(rows *sqlx.Rows, structSlice []struct{}, structBody struct{}) ([]struct{}, error) {
for rows.Next() {
err := rows.StructScan(&structBody)
if err != nil {
return nil, err
}
structSlice = append(structSlice, structBody)
}
err := rows.Err()
if err != nil {
return nil, err
}
return structSlice, nil
}
假设我的结构是
OrderRevenue
类型。当我调用上面的函数时:
structSlice, err := generateResponse(rows, []OrderRevenue{}, OrderRevenue{})
我得到的错误是:
cannot use []OrderRevenue literal as type []struct{} in argument...
我会以错误的方式处理吗?
最佳答案
这被认为是Go类型系统的基石(或更多的限制)。 struct{}
是一种未命名的类型,它与struct{ field1 int }
不同,并且当然与OrderRevenue{}
不同。
Go强调通过接口的抽象,也许您应该尝试一下。这是第一个方法:
type OrderRevenue interface {
MarshalMyself() ([]byte, error)
}
type Anonymous struct {}
func (a Anonymous) MarshalMyself() ([]byte, error) {
// implementation's up to you
return []byte{}, nil
}
// the function signature
generateResponse(rows *sqlx.Rows, structSlice []OrderRevenue, structBody Body) ([]Body, error) {
// ...
}
在这种情况下,您还可以使用所有类型都实现的空接口
interface{}
,但是您必须递归地遍历该结构以进行手动类型声明。 Go中最好的方法是至少部分地提前知道数据的形状。