最近在看goframe的官方发的demo学习包,其中多个子包都定义了个空结构体的全局变量。这个用意我想不明白了。

用空结构体是为了包装函数变成方法,可能是出于安全机制考虑,其次用空结构体还有节省点内存的作用。

但是,通过全局变量调用是怎么回事呢?

User.SignUp(....)
// 中间件管理服务
var User = userService{}

type userService struct{}

// 用户注册
func (s *userService) SignUp(r *model.UserServiceSignUpReq) error {
    // 昵称为非必需参数,默认使用账号名称
    if r.Nickname == "" {
        r.Nickname = r.Passport
    }
    // 账号唯一性数据检查
    if !s.CheckPassport(r.Passport) {
        return errors.New(fmt.Sprintf("账号 %s 已经存在", r.Passport))
    }
    // 昵称唯一性数据检查
    if !s.CheckNickName(r.Nickname) {
        return errors.New(fmt.Sprintf("昵称 %s 已经存在", r.Nickname))
    }
    if _, err := dao.User.Save(r); err != nil {
        return err
    }
    return nil
}

虽然用全局变量调用方法也是可行的,但这样可能存在并发调用冲突的可能吧?