1. 设计模式:建造者
package main
import (
"errors"
"fmt"
)
type Person struct {
name string
age int
height float64
weight float64
}
type BuildPerson struct {
name string
age int
height float64
weight float64
}
// 设置name
func (b *BuildPerson) setName(name string) error {
if name == "" {
return errors.New("name is allowed null")
} else {
b.name = name
}
return nil
}
// 设置age
func (b *BuildPerson) setAge(age int) error {
if age == 0 {
return errors.New("age is allowed 0")
} else {
b.age = age
}
return nil
}
// 设置height
func (b *BuildPerson) setHeight(height float64) error {
b.height = height
return nil
}
// 设置weight
func (b *BuildPerson) setWeight(weight float64) error {
b.weight = weight
return nil
}
func (b *BuildPerson) Build() (*Person, error) {
if b.name == "" {
return nil, errors.New("name is allowed null")
}
if b.age == 0 {
return nil, errors.New("age is allowed null")
}
if b.height == 0 {
return nil, errors.New("height is allowed 0")
}
if b.weight == 0 {
return nil, errors.New("weight is allowed 0")
}
p := &Person{
name: b.name,
age: b.age,
height: b.height,
weight: b.weight,
}
return p, nil
}
func main() {
buildPerson := &BuildPerson{}
//var buildPerson *BuildPerson // 声明BuildPerson指针类型如果没有初始化,调用set方法会抛空指针异常
//buildPerson = &BuildPerson{}
var err error
if err = buildPerson.setName("xiaoming"); err != nil {
panic(err)
}
if err = buildPerson.setAge(18); err != nil {
panic(err)
}
if err = buildPerson.setHeight(178.99); err != nil {
panic(err)
}
if err = buildPerson.setWeight(128.99); err != nil {
panic(err)
}
p, err := buildPerson.Build()
if err != nil {
panic(err)
}
fmt.Println(p)
}
注意事项:指针类型在声明后,如果不初始化,直接去调用方法会抛空指针