我在go项目中遇到了一个很大的架构问题。
- 我有一个API,使用来自MongoDB数据库的结构。这意味着我使用
database.ObjectID
数据类型来存储我的id。例如,我将如何在API中存储一个用户:
type User struct {
Id primitive.ObjectId `bson:"_id,omitempty"`
Username string
Tag int
}
- 前端应用程序也是在go中制作的,并使用相同的结构,因为它显然从API获取数据。但是对于前端应用程序来说,使用这种
primitive.ObjectID
数据类型不是很方便:对字符串的解析不是自动的,而且有点难以操作。所以从应用程序前端的角度来看,数据结构更可能是这样的:
type User struct {
Id string
Username string
Tag int
}
现在为了不重复太多的代码,我想重用这些结构从一个项目到另一个第三方模块,我将创建,而不必写它们两次(一个版本与string
,另一个与primitive.ObjectId
)。
我该怎么办?
创建一个新的ID
类型,等于interface{}
。然后使用这个ID
类型,在需要时转换为primitive.ObjectID
或string
。(见下面的例子)
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
}