写点什么

Golang 设计模式:builder

作者:baiyutang
  • 2021 年 11 月 21 日
  • 本文字数:922 字

    阅读完需:约 3 分钟

译者:baiyutang

原文:https://dev.to/ynwd/design-pattern-in-golang-builder-2am


builder 模式用于创建一个结构体的实例——连同它的所有属性。


注意下面的结构体:

package main
type User struct { name string email string address string dateOfBirth DateOfBirth}
复制代码


package main
type DateOfBirth struct { year int month int day int}
复制代码


模式实现

package main
import ( "fmt" "strconv" "strings")
func newUserBuilder() *User { return &User{}}
func (u *User) Build() (User, error) { return User{ name: u.name, email: u.email, address: u.address, dateOfBirth: u.dateOfBirth, }, nil}
func (u *User) SetName(name string) { u.name = name}
func (u *User) SetEmail(email string) { u.email = email}
func (u *User) SetAddress(address string) { u.address = address}
func (u *User) SetDateOfBirth(dob string) { splitted := strings.Split(dob, "/")
day, err := strconv.Atoi(splitted[0]) if err != nil { u.dateOfBirth = DateOfBirth{} }
month, err := strconv.Atoi(splitted[1]) if err != nil { u.dateOfBirth = DateOfBirth{} }
year, err := strconv.Atoi(splitted[2]) if err != nil { u.dateOfBirth = DateOfBirth{} }
u.dateOfBirth = DateOfBirth{day, month, year}}
复制代码


事实上,如果您愿意,您可以向将要输入的每个变量添加验证——在它被结构的任何属性使用之前。


使用方法

package main
func main() { builder := newUserBuilder() builder.SetName("agus") builder.SetAddress("cirebon") builder.SetEmail("agus@email.com") builder.SetDateOfBirth("01/01/2020") user, err := builder.Build() if err != nil { fmt.Println(err) return } fmt.Println(user)}
复制代码

结论

使用构建器模式,我们可以创建一个结构体的实例,并向将作为其输入的变量添加验证。

发布于: 4 小时前阅读数: 11
用户头像

baiyutang

关注

广州 2017.12.13 加入

Microservices | Golang | Cloud Nitive | “Smart work,Not hard”

评论

发布
暂无评论
Golang 设计模式:builder