在极客时间上看了耗子叔发布的《Go语言编程模式实战》后,将这个模式用在了项目使用上,用于初始化数据。我的需求:结构体中分为用户的5部分信息,在insert的时候都是必填,在get的时候要验证该数据存不存在,不存在则insert一条数据,所以会出现除id必填以外,其他的都可为空。这就造成了传参数的话有很多“”,所以用了这个模式来处理数据初始化。
// entity begin
type Expert struct {
store.BaseModel
TenantId string `sql:"type:varchar(100)" json:"tenant_id"`
UserId string `sql:"type:varchar(100)" json:"user_id"`
Photo string `sql:"type:varchar(100)" json:"photo"`
CallName string `sql:"type:varchar(100)" json:"call_name"`
Name string `sql:"type:varchar(100)" json:"name"`
IdentityField string `sql:"type:varchar(100)" json:"identity_field"`
WorkTime int64 `sql:"type:int(100)" json:"work_time"`
ProvinceCode string `sql:"type:varchar(100)" json:"province_code"`
CityCode string `sql:"type:varchar(100)" json:"city_code"`
DistrictCode string `sql:"type:varchar(100)" json:"district_code"`
Position string `sql:"type:varchar(100)" json:"position"`
Advantage string `sql:"type:varchar(100)" json:"advantage"`
Mobile string `sql:"type:varchar(100)" json:"mobile"`
Email string `sql:"type:varchar(100)" json:"email"`
DisplayName string `sql:"type:varchar(100)" json:"display_name"`
ExpectSalary string `sql:"type:varchar(100)" json:"expect_salary"`
BankCard string `sql:"type:varchar(100)" json:"bank_card"`
AcctName string `sql:"type:varchar(100)" json:"acct_name"`
BankName string `sql:"type:varchar(100)" json:"bank_name"`
RcvBank string `sql:"type:varchar(100)" json:"rcv_bank"`
RealAuthStatus string `sql:"type:varchar(100)" json:"real_auth_status"`
AgreementAt int64 `sql:"type:int(100)" json:"agreement_at"`
IdCardNo string `sql:"type:varchar(30)" json:"id_card_no"`
IdCardType string `sql:"type:varchar(2)" json:"id_card_type"`
Nationality string `sql:"type:varchar(30)" json:"nationality"`
Gender string `sql:"type:varchar(6)" json:"gender"`
}
type Option func(*Expert)
func Information(photo,callName,identityField,provinceCode, cityCode, districtCode string,workTime int64) Option {
return func(s *Expert) {
s.Photo = photo
s.CallName = callName
s.IdentityField = identityField
s.WorkTime = workTime
s.ProvinceCode = provinceCode
s.CityCode = cityCode
s.DistrictCode = districtCode
}
}
func BriefIntroduction(position,advantage string) Option {
return func(s *Expert) {
s.Position = position
s.Advantage = advantage
}
}
func ContactInformation(mobile,email,display_name string) Option {
return func(s *Expert) {
s.Mobile = mobile
s.Email = email
s.DisplayName = display_name
}
}
func AgreementAt(agreementAt int64) Option {
return func(s *Expert) {
s.AgreementAt = agreementAt
}
}
func ChargingInformation(expectSalary,bankCard,acctName,bankName,rcvBank string) Option {
return func(s *Expert) {
s.ExpectSalary = expectSalary
s.BankCard = bankCard
s.AcctName = acctName
s.BankName = bankName
s.RcvBank = rcvBank
}
}
func UserIdInformations(name,idCardNo,idCardType,nationality,gender,realAuthStatus string) Option {
return func(s *Expert) {
s.Name = name
s.IdCardNo = idCardNo
s.IdCardType = idCardType
s.Nationality = nationality
s.Gender = gender
s.RealAuthStatus = realAuthStatus
}
}
func NewExperts(tenantId,userId string, options ...func(*Expert)) (*Expert, error) {
method := lu.Method("store.NewExperts")
id, err := common.Gid()
if err != nil {
common.Log.ErrorWithFields(map[string]interface{}{"method": method, "error": err, "entity": "customer experts"}, "Failed to initialize the entity")
return nil, errors.ConvertFrom(err)
}
expert := &Expert{
BaseModel: store.BaseModel{
Id: id,
},
TenantId: tenantId,
UserId: userId,
}
for _, option := range options {
option(expert)
}
return expert, nil
}
//全参数调用
expert, err := store.NewExperts(tenantId, userId, store.Information(req.Photo, req.CallName, req.IdentityField, req.ProvinceCode, req.CityCode, req.DistrictCode, req.WorkTime), store.BriefIntroduction(req.Position, req.Advantage), store.ContactInformation(req.Mobile, req.Email, req.DisplayName), store.ChargingInformation(req.ExpectSalary, req.BankCard, req.AcctName, req.BankName, req.RcvBank), store.UserIdInformations(Name, IdCardNo, IdCardType, Nationality, Gender, RealAuthStatus))
//缺少参数调用
experts, err := store.NewExperts(tenantId, userId, store.UserIdInformations(Name, IdCardNo, IdCardType, Nationality, Gender, RealAuthStatus))