Golang MySQL扫描仅在通过所有字段时填充结果

Golang MySQL扫描仅在通过所有字段时填充结果,go,Go,Golang mysqlrow.Scan(&pointerAddress)不填充字段 当我发送请求时向我显示这一点,这样就可以了 如果我将所有用户结构字段填充到row.Scan(&User.Email等…)中,则仅在结果中显示值 代码: type User struct{ Id int `json:"id"` Email string `json:"email"` Password string `json:"passw

Golang mysql
row.Scan(&pointerAddress)
不填充字段

当我发送请求时向我显示这一点,这样就可以了

如果我将所有用户结构字段填充到
row.Scan(&User.Email等…)
中,则仅在结果中显示值

代码:

type User struct{
    Id int `json:"id"`
    Email string `json:"email"`
    Password string `json:"password"`
    Firstname string `json:"firstname"`
    Lastname string `json:"lastname"`
    RememberToken string `json:"remember_token"`
    Phone int64 `json:"phone"`
    AgreeTerms int8 `json:"agree_terms"`
    AllowPromotionalOffers int8 `json:"allow_promotional_offers"`
    CreatedAt string `json:"created_at"`
    UpdatedAt string `json:"updated_at"`
    LandlordId int64 `json:"landlord_id"`
    RenterId int64 `json:"renter_id"`
}
我的登录功能:

func Login(w http.ResponseWriter, r *http.Request) {
    user := models.User{}

    err := json.NewDecoder(r.Body).Decode(&user)

    if err != nil {
        fmt.Println(err)
    }

    row, err := database.DB.Query("SELECT * FROM users WHERE email=?", user.Email)

    if err != nil {
        fmt.Errorf("%w", err)
    }

    defer row.Close()

    for row.Next() {
        err = row.Scan(&user.Id, &user.Email, &user.Password)

        if err != nil {
            fmt.Errorf("%w", err)
        }
    }

    err = json.NewEncoder(w).Encode(user)

    if err != nil {
        fmt.Errorf("%w", err)
    }
}

如果结果集是一个查询行(可能是一个结构片),请尝试在for语句中初始化结构:

如果使用的是QueryRow结果集,则不需要循环

    row, err := database.DB.QueryRow("SELECT id, email, password FROM users WHERE email=?", 
    user.Email).Scan(&user.Id, &user.Email, &user.Password)
作为最佳实践,如果不是必需的,则应避免使用“*”。)
虽然有点冗长,但它可以工作。

使用
,在
json
标记中省略空的
。请注意,这与SQL和行扫描有关。在Go中,当您初始化一个结构时,它的所有字段都被初始化为其类型的零值,并且仅仅因为没有显式设置它们并不意味着它们不存在,它们就存在。Go中没有“未定义”字段。谢谢,它更改了json响应,但是
row.Scan(&user.Id)
显示为空,意味着不显示结果。我不确定您的评论是什么意思。请尝试更详细地解释新问题是什么。编辑问题并添加新代码、新输入和新输出。谢谢,已更新问题。请注意,
database/sql
仅提供基本的sql内容。如果使用
SELECT*FROM…
则必须以正确的顺序手动传递所有字段。如果使用
从…
中选择id、电子邮件、名字、姓氏,则必须手动将相应的4个字段传递到
扫描
。有一种方法可以绕过标准库。如果您不想这样做,您必须使用一些可以为您做的库,比如sqlx或其他类似ORM的东西。
    row, err := database.DB.QueryRow("SELECT id, email, password FROM users WHERE email=?", 
    user.Email).Scan(&user.Id, &user.Email, &user.Password)