gpt4 book ai didi

go - 无法将nil(无类型的nil值)转换为struct

转载 作者:行者123 更新时间:2023-12-01 21:17:23 25 4
gpt4 key购买 nike

Go noob在这里学习如何使用sqlc。我正在尝试创建一种创建用户的方法。
如何为结构返回nil

type user struct{}

func (u *user) Create(ctx context.Context, db *sql.DB) (pg.User, error) {
q := pg.New(db)
user, err := q.CreateUser(ctx, "Someone")
if err != nil {
return nil, err
// ^
// [compiler] [E] cannot convert nil (untyped nil value) to pg.User
}
return user, nil
}
这是 pg.User结构:
type User struct {
ID int64 `json:"id"`
// can not be empty
Name string `json:"name"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
当前,我返回的是指针,它没有错误:
func (u *user) Create(ctx context.Context, db *sql.DB) (*pg.User, error) {
q := pg.New(db)
var usr *pg.User
user, err := q.CreateUser(ctx, "Someone")
if err != nil {
return nil, err
}

fmt.Println(">> user:", user)
// >> user: {1 Someone 2020-09-14 18:36:05.94079 +0000 UTC 2020-09-14 18:36:05.94079 +0000 UTC}

usr = &user
fmt.Println(">> usr:", usr)
// >> usr: &{1 Someone 2020-09-14 18:36:05.94079 +0000 UTC 2020-09-14 18:36:05.94079 +0000 UTC}

return usr, nil
}
但是,还有一个问题,哪个更好,是否返回指针?

最佳答案

使用指针返回类型完全可以。
如果您希望返回一个非指针结构,则只需返回该结构的zero value即可:

return pg.User{}, err
或更改函数签名以包含变量名称返回(注意:使用 =而不是 :=,因为已经认为已声明了变量):
func (u *user) Create(ctx context.Context, db *sql.DB) (u pg.User, err error) {
q := pg.New(db)
u, err = q.CreateUser(ctx, "Someone")

return // will implicitly return u & err for you
}
并且由于 if err逻辑已被删除,因此上述内容可以简化为单行代码:
func (u *user) Create(ctx context.Context, db *sql.DB) (pg.User, error) {
return pg.New(db).CreateUser(ctx, "Someone")
}

关于go - 无法将nil(无类型的nil值)转换为struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63890251/

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