gpt4 book ai didi

struct - golang 从结构中返回第一个字段

转载 作者:数据小太阳 更新时间:2023-10-29 03:42:34 27 4
gpt4 key购买 nike

我正在尝试返回给定一个属性的所有用户信息,该属性可以是 user_id、电子邮件或名称。

u := User{
Email: "goda@go.com"
})
k := User {
Name: "john"
}

ReturnUserInfo(u)
ReturnUserInfo(k)

我调用传递一个只有一个字段的用户结构的函数。然后我想在不明确说出电子邮件的情况下解析该字段。最后,我通过传递隐式字段(user_id 或电子邮件等)获取用户信息

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) 不能使用“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 不是更好吗?为什么要尝试选择筛选器对应字段?

关于struct - golang 从结构中返回第一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33179479/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com