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
}
不过,还有一个问题,返回指针和不返回指针哪个更好?
使用指针返回类型是非常好的。
如果您希望返回一个非指针结构,那么只需返回该结构的零值:
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")
}