- 技术栈
2.构造函数
package Object type User struct { Id,Sex int Name string } //func NewUser() User { // return User{} //} //有选择的对ID 进行赋值 func NewUser(f func(u *User))*User { u:=new(User) f(u) return u } //返回的是函数本身 而不是函数的返回值 func WithUserID(id int) func(u *User) { return func(u *User) { u.Id=id } }
package main func main() { u:=Object.NewUser( Object.WithUserID(200), ) fmt.Println(u) }
3.优化代码 可传变参
package Object type User struct { Id,Sex int Name string } //func NewUser() User { // return User{} //} //有选择的对ID 进行赋值 func NewUser(fs ...func(u *User))*User { u:=new(User) for _,f:=range fs{ f(u) } return u } //返回的是函数本身 而不是函数的返回值 func WithUserID(id int) func(u *User) { return func(u *User) { u.Id=id } } func WithUserName(name string) func(u *User) { return func(u *User) { u.Name=name } }
func main() { u:=Object.NewUser( Object.WithUserID(200), Object.WithUserName("xinyu"), ) fmt.Println(u) }
4.继续优化 容易理解
package Object type UserAttrsFunc func(u *User) //返回的是函数本身 而不是函数的返回值 type UserAttrsFuncs []UserAttrsFunc func(this UserAttrsFuncs) apply(u *User) { for _ ,f:=range this{ f(u) } } func WithUserID(id int) UserAttrsFunc { return func(u *User) { u.Id=id } } func WithUserName(name string) UserAttrsFunc { return func(u *User) { u.Name=name } }
package Object import "fmt" type User struct { Id,Sex int Name string } //func NewUser() User { // return User{} //} //有选择的对ID 进行赋值 func NewUser(fs ...UserAttrsFunc)*User { u:=new(User) UserAttrsFuncs(fs).apply(u) fmt.Printf("%T",fs) return u }
func main() { u:=Object.NewUser( Object.WithUserID(200), Object.WithUserName("xinyu"), ) fmt.Println(u) }