go 基础加强-构造函数

  1. 技术栈

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

  

猜你喜欢

转载自www.cnblogs.com/kdxx/p/12668764.html