package main
import "fmt"
/*
①封装人,属性包括姓名、年龄、身高、体重、颜值、资产、性别、性取向
②给人封装结婚方法,参数是潜在的结婚对象:
a、如果对方的性取向有问题,panic
b、如果对方的颜值过低,返回错误
c、否则返回满意程度
*/
type Gender int //性别取向
func (g Gender) String() string {
return []string{"Male","Female","Bisexual"}[g]
}
//性别枚举
const (
Male = iota //男
Female //女
Bisexual //人妖
)
type Human struct{
Name string //名字
Age int //年龄
Height int //身高
Weight int //体重
Looking int //自己的颜值
TargetLooking int //期望的颜值
Rmb int //人民币
Sex Gender //自己的性别
TargetSex Gender //结婚目标性别
}
//不理想配偶错误
type BadSouseError struct {
why string
}
func (bse *BadSouseError)Error() string{
return bse.why
}
//工厂方法
func CreateBadSpouseError(o *Human) *BadSouseError {
bse := new(BadSouseError)
if o.Rmb < 1000000{
bse.why = "太穷"
} else if o.Weight > 200 {
bse.why = "太胖"
} else if o.Age > 50 {
bse.why = "太老"
} else {
return nil
}
return bse
}
func (h *Human)Marry(o *Human) (happiness int, err error) {
//如果他的性别不等于你期望性别,报错
if o.Sex != h.TargetSex {
panic(&BadSouseError{"淡定,,,我不是你的菜"})
return
}
if err = CreateBadSpouseError(o);err != nil {
return
}
//如果颜值过低,返回错误
if o.Looking < h.TargetLooking {
panic(&BadSouseError{"sorry,颜值不匹配"})
return
}
//计算幸福程度
happiness =(o.Height*o.Looking)/(h.Weight*h.TargetLooking)
return
}
func NewHuman(name string,age,height,weight,rmb,looking,targetlooking int,sex,targetsex Gender) *Human{
human := new(Human)
human.Name = name
human.Age = age
human.Height = height
human.Weight = weight
human.Rmb = rmb
human.Looking = looking
human.TargetLooking = targetlooking
human.Sex = sex
human.TargetSex = targetsex
return human
}
func main(){
defer func(){
if err := recover(); err != nil {
fmt.Println(err)
}
}()
cook :=NewHuman("库克",11,180,123,123456,60,10,Male,Male)
ySister := NewHuman("你妹",20,155,150,4321,20,90,Male,Male)
happiness,err := cook.Marry(ySister)
if err != nil {
fmt.Println("牵手失败",err)
} else {
fmt.Println("牵手成功,幸福指数=",happiness)
}
}