如何在两个go应用程序之间共享略有不同的结构?



我在go项目中遇到了一个很大的架构问题。

  1. 我有一个API,使用来自MongoDB数据库的结构。这意味着我使用database.ObjectID数据类型来存储我的id。例如,我将如何在API中存储一个用户:
type User struct {
Id       primitive.ObjectId `bson:"_id,omitempty"`
Username string
Tag      int
}
  1. 前端应用程序也是在go中制作的,并使用相同的结构,因为它显然从API获取数据。但是对于前端应用程序来说,使用这种primitive.ObjectID数据类型不是很方便:对字符串的解析不是自动的,而且有点难以操作。所以从应用程序前端的角度来看,数据结构更可能是这样的:
type User struct {
Id       string
Username string
Tag      int
}

现在为了不重复太多的代码,我想重用这些结构从一个项目到另一个第三方模块,我将创建,而不必写它们两次(一个版本与string,另一个与primitive.ObjectId)。

我该怎么办?

创建一个新的ID类型,等于interface{}。然后使用这个ID类型,在需要时转换为primitive.ObjectIDstring。(见下面的例子)

type User struct {
ID ID `bson:"_id"`
}
type ID = interface{}
func main() {
u := User{
ID: primitive.NewObjectID(),
}
oid := u.ID.(primitive.ObjectID) // Cast to "primitive.ObjectID"
fmt.Println(reflect.TypeOf(oid)) // primitive.ObjectID
}

最新更新