当前位置: 首页 > wzjs >正文

泰安网站建设定制公司深圳比较好的建网站公司

泰安网站建设定制公司,深圳比较好的建网站公司,网络设计课程设计前言,开源商城app十、自定义数据类型 自定义的数据类型必须实现 Scanner 和 Valuer 接口,以便让 GORM 知道如何将该类型接收、保存到数据库 1. 存储结构体 type Info struct {Status string json:"status"Addr string json:"addr"Age int json:"…

十、自定义数据类型

自定义的数据类型必须实现 Scanner 和 Valuer 接口,以便让 GORM 知道如何将该类型接收、保存到数据库

1. 存储结构体

type Info struct {Status string `json:"status"`Addr   string `json:"addr"`Age    int    `json:"age"`
}// Scan 从数据库中读取出来
func (i *Info) Scan(value interface{}) error {bytes, ok := value.([]byte)if !ok {return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))}info := Info{}err := json.Unmarshal(bytes, &info)*i = inforeturn err
}// Value 存入数据库
func (i Info) Value() (driver.Value, error) {return json.Marshal(i)
}type User struct {ID   uintName stringInfo Info `gorm:"type:string"`
}
添加和查询
DB.Create(&User{Name: "枫枫",Info: Info{Status: "牛逼",Addr:   "成都市",Age:    21,},
})var user User
DB.Take(&user)
fmt.Println(user)

2. 枚举类型

枚举1.0

很多时候,我们会对一些状态进行判断,而这些状态都是有限的

例如,主机管理中,状态有 Running 运行中, OffLine 离线, Except 异常

如果存储字符串,不仅是浪费空间,每次判断还要多复制很多字符,最主要是后期维护麻烦

type Host struct {ID     uintName   stringStatus string
}func main() {host := Host{}if host.Status == "Running" {fmt.Println("在线")}if host.Status == "Except" {fmt.Println("异常")}if host.Status == "OffLine" {fmt.Println("离线")}
}

后来,我们知道了用常量存储这些不变的值

type Host struct {ID     uintName   stringStatus string
}const (Running = "Running"Except = "Except"OffLine = "OffLine"
) func main() {host := Host{}if host.Status == Running {fmt.Println("在线")}if host.Status == Except {fmt.Println("异常")}if host.Status == OffLine {fmt.Println("离线")}
}

虽然代码变多了,但是维护方便了

但是数据库中存储的依然是字符串,浪费空间这个问题并没有解决

枚举2.0

于是想到使用数字表示状态

type Host struct {ID     uintName   stringStatus int
}const (Running = 1Except  = 2OffLine = 3
)func main() {host := Host{}if host.Status == Running {fmt.Println("在线")}if host.Status == Except {fmt.Println("异常")}if host.Status == OffLine {fmt.Println("离线")}
}

但是,如果返回数据给前端,前端接收到的状态就是数字,不过问题不大,前端反正都要搞字符映射的

因为要做颜色差异显示

但是这并不是后端偷懒的理由

于是我们想到,在json序列化的时候,根据映射转换回去

type Host struct {ID     uint   `json:"id"`Name   string `json:"name"`Status int    `json:"status"`
}func (h Host) MarshalJSON() ([]byte, error) {var status stringswitch h.Status {case Running:status = "Running"case Except:status = "Except"case OffLine :status = "OffLine"}return json.Marshal(&struct {ID     uint   `json:"id"`Name   string `json:"name"`Status string `json:"status"`}{ID:     h.ID,Name:   h.Name,Status: status,})
}const (Running = 1Except  = 2OffLine  = 3
)func main() {host := Host{1, "枫枫", Running}data, _ := json.Marshal(host)fmt.Println(string(data)) // {"id":1,"name":"枫枫","status":"Running"}
}

这样写确实可以实现我们的需求,但是根本就不够通用,凡是用到枚举,都得给这个Struct实现MarshalJSON方法

枚举3.0

于是类型别名出来了

type Status intfunc (status Status) MarshalJSON() ([]byte, error) {var str stringswitch status {case Running:str = "Running"case Except:str = "Except"case OffLine:str = "Status"}return json.Marshal(str)
}type Host struct {ID     uint   `json:"id"`Name   string `json:"name"`Status Status `json:"status"`
}const (Running Status = 1Except  Status = 2OffLine Status = 3
)func main() {host := Host{1, "枫枫", Running}data, _ := json.Marshal(host)fmt.Println(string(data)) // {"id":1,"name":"枫枫","status":"Running"}
}

嗯,代码简洁了不少,在使用层面已经没有问题了

但是,这个结构体怎么表示数据库中的字段呢?

golang中没有枚举

我们只能自己通过逻辑实现枚举

type Weekday intconst (Sunday    Weekday = iota + 1 // EnumIndex = 1Monday                       // EnumIndex = 2Tuesday                      // EnumIndex = 3Wednesday                    // EnumIndex = 4Thursday                     // EnumIndex = 5Friday                       // EnumIndex = 6Saturday                     // EnumIndex = 7
)var WeekStringList = []string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
var WeekTypeList = []Weekday{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}// String 转字符串
func (w Weekday) String() string {return WeekStringList[w-1]
}// MarshalJSON 自定义类型转换为json
func (w Weekday) MarshalJSON() ([]byte, error) {return json.Marshal(w.String())
}// EnumIndex 自定义类型转原始类型
func (w Weekday) EnumIndex() int {return int(w)
}// ParseWeekDay 字符串转自定义类型
func ParseWeekDay(week string) Weekday {for i, i2 := range WeekStringList {if week == i2 {return WeekTypeList[i]}}return Monday
}// ParseIntWeekDay 数字转自定义类型
func ParseIntWeekDay(week int) Weekday {return Weekday(week)
}type DayInfo struct {Weekday Weekday   `json:"weekday"`Date    time.Time `json:"date"`
}func main() {w := Sundayfmt.Println(w)dayInfo := DayInfo{Weekday: Sunday, Date: time.Now()}data, err := json.Marshal(dayInfo)fmt.Println(string(data), err)week := ParseWeekDay("Sunday")fmt.Println(week)week = ParseIntWeekDay(2)fmt.Println(week)
}

在需要输出的时候(print,json),自定义类型就变成了字符串

从外界接收的数据也能转换为自定义类型,这就是golang中的枚举,假枚举

http://www.dtcms.com/wzjs/547558.html

相关文章:

  • 免费自助制作永久网站站内seo优化
  • 宁波好品质品牌网站设计哪家好网站标题更改
  • 网站运营服务商注册商标怎么注册商标
  • 开网站需要钱吗邢台市教育局
  • 便宜网站建设什么行业最容易做网站
  • 如何推广网站链接网站备案要拍照大家怎么做的啊
  • 一了网站wordpress 安装 白屏
  • 专门做家具网站django 微信小程序开发教程
  • 淄博哪有培训做网站的自己做的网站出现500错误怎么解决
  • 外贸网站建设seo标书制作难吗
  • 个人微信网站怎么做温州瓯北做网站
  • 网站开发实现编码免费下载设计素材网站
  • 深圳网站建设报价python做网站实战
  • 服装网站建设竞争对手调查分析wordpress免费还是收费
  • 苏州网站建设点一点怎么用ps做网站首页图片尺寸
  • 百度竞价价格查询英文seo
  • 公司手机网站设计网站建设与策划试卷
  • 迷你主机做网站制作公司网站的
  • 网站+做内容分发资格上海抖音seo公司
  • 影视公司网站模板网站做rss wordpress
  • 深圳有做网站的公司商城网站制作教程
  • 铜川网站设计网站名字和域名
  • 广州营销型网站建设调取当前文章标签wordpress
  • 信息化工作总结 网站建设济宁seo
  • 城乡建设举报网站seo排名整站优化
  • 手机网站设计报告模板在线设计平台哪个好用
  • 辽宁省建设监理协会网站陈塘庄做网站公司
  • 怎么学做网站制作主题资源网站建设作业
  • 电子商务的网站建设名词解释徐州城乡建设网站
  • 建企业网站的步骤上海最专业的网站设