我想创建接受传递的任何结构并使用它的函数(在我的例子中,根据结构名称将其存储在数据库中)。
如何做到这一点?
这是我的代码供参考:
func (ds *DBService) Create(u any) (string, error) {
structName := reflect.TypeOf(u).Name()
switch structName {
case "User":
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(3*time.Second))
defer cancel()
User := u.(modals.User)
objid, err := ds.db.Create(ctx, "users", User) //Calls database to store the user
if err != nil {
return "", err
}
return objid, nil
default:
log.Print("wrong data struct")
return "", errors.New("failed to create User in a database")
}
}
当使用传递的 User 结构调用该函数时,此函数可以编译,但会在运行时抛出空指针取消引用错误。
你可以打开结构类型,这样会更清晰:
switch v := u.(type) {
case User:
// 'v' is now User
return ds.db.Create(ctx, "users", v)
case Other:
// 'v' is now Other
default:
return "", fmt.Errorf("unexpected type '%T'", v)
}