无法将nil(非类型化的nil值)转换为结构

  • 本文关键字:nil 转换 结构 类型化 go
  • 更新时间 :
  • 英文 :


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")
}

最新更新