猿问

使用文字作为赋值类型

我使用中的代码func Root作为创建Login下面显示的另一种方法的指南。特别是,在 中Root,我将文字分配Book{}给b,然后在Scan. 该代码不会引发任何错误(尽管我不确定它是否是好的代码),但是当我尝试在Login函数中执行类似的操作时,我正在从这篇博文修改该函数,我收到此错误


cannot use User literal (type User) as type *User in assignment

对于它的价值,我在编译时也在上面得到这个错误


no new variables on left side of :=

但是我不是在第二种方法中做同样的事情,即将文字分配给u := User{}变量然后在扫描中使用它吗?


当你可以和不能在赋值中使用文字类型时,你能用下面的代码解释一下吗?


func Root(w http.ResponseWriter, r *http.Request) {


    rows, err := db.Query("SELECT title, author, description FROM books")

    books := []Book{}

    for rows.Next() {

        b := Book{}

        err := rows.Scan(&b.Title, &b.Author, &b.Description)

        PanicIf(err)

        books = append(books, b)

    }

    ...//code ommitted




func Login(password, email string) (u *User, err error) {

    u := User{}

    db.QueryRow("select * from users where email=$1 ", email).Scan(&u.Id, &u.Password, &u.Email)

    if err != nil {

        return

    }


    err = bcrypt.CompareHashAndPassword(u.Password, []byte(password))

    if err != nil {

        u = nil

    }

    return

}


慕标琳琳
浏览 202回答 2
2回答

眼眸繁星

b := Book{}定义一个新变量(b之前未定义),因此它可以采用值类型Booku := User{}没有定义新变量,因为它是方法返回参数的一部分u *User,所以不能使用:=.会的u=&User{}。u这是一个命名的结果参数:如果函数执行不带参数的 return 语句,则结果参数的当前值将用作返回值。
随时随地看视频慕课网APP

相关分类

Go
我要回答