为了账号安全,请及时绑定邮箱和手机立即绑定

golang从结构返回第一个字段

golang从结构返回第一个字段

Go
慕容708150 2021-11-15 16:58:51
我试图返回给定一个属性的所有用户信息,该属性可以是 user_id、电子邮件或名称。u := User{ Email: "goda@go.com" })k := User {Name: "john"}ReturnUserInfo(u)ReturnUserInfo(k)我调用传递一个只有一个字段的 User 结构的函数。然后我想在不明确说出电子邮件的情况下解析该字段。最后,我通过传递一个隐式字段(user_id 或 email 等)来获取用户信息func ReturnUserInfo(u User) (y User){    // Retrieve first field from u and set them to field and value.    // NOT explicitly stating field := email, value := u.Email    db, _ := sql.Open("mysql", "root:password@/users")    _ := db.QueryRow("SELECT user_id, name, email FROM users WHERE ? = ?", field, value).Scan(        &u.User_id, &u.Name, &u.Email)    y = User{        User_id: u.User_id,        Name: u.Name,        Email: u.Email,    }    return y}我不确定我是否能够在 Golang 中执行此操作,但我正在创建此函数,因此我不必明确告诉 Go 查找特定属性以返回用户信息。
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

你想要的有几个糟糕的或至少有争议的设计决策。


1) 不能使用“WHERE ? = ?”的 SQL 语句。列名不能用 ? 代替,只有值可以。不是golang引起的,而是数据库引起的,因为在获取request的时候会创建一个如何获取数据的计划(使用哪个索引或者全表扫描……)。


这意味着您必须为每一列创建不同的查询字符串,您要在 where 子句中使用。它看起来像这样:


    func GetUserInfoByColumn(field string) *User, error {

query := fmt.Sprintf("SELECT user_id, name, email FROM users WHERE %s = ?", column)

    var u User

    err := db.QueryRow(query, value).Scan(&u.User_id, &u.Name, &u.Email)

    if err != nil {return nil, err}

    return &u, nil

    }

比这更有效的是使用闭包并在那里创建查询。


2) db.QueryRow 看起来是另一个问题。只有当您确定只有一行符合您的条件时,您才能使用它。如果您不太确定,请使用 db.Query。


3)在go中,您可以使用reflect来获取结构中所有项目的名称。但是如果你的结构只有很少的字段,那就太复杂了。在我们的例子中,您可以非常简单地创建所有必要的功能。


4)我不明白为什么你总是试图只填充结构的一个字段并将过滤器放入结构中。拥有更多功能并在适当的代码位置调用 UserInfoByName 或 UserInfoByEmail 不是更好吗?为什么你试图选择一个过滤器accoring字段?


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信