接受任何结构体作为参数并根据结构体名称使用它的Golang函数

问题描述 投票:0回答:1

我想创建接受传递的任何结构并使用它的函数(在我的例子中,根据结构名称将其存储在数据库中)。

如何做到这一点?

这是我的代码供参考:

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 结构调用该函数时,此函数可以编译,但会在运行时抛出空指针取消引用错误。

go generics struct
1个回答
0
投票

你可以打开结构类型,这样会更清晰:

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)
}

来自语言之旅:https://go.dev/tour/methods/16

© www.soinside.com 2019 - 2024. All rights reserved.