上一篇 Go圣经-学习笔记之程序结构golang
type 类型名字 底层类型 type City string // 城市 type Province string // 省份
虽然两个类型的底层数据类型相同,可是它们是两种不一样的数据类型。它们是不能用来直接进行比较或者运算的。须要显示转换。学习
定义新类型的好处是,咱们能够给这个类型添加方法集,表示这个类型定义的变量具备一系列行为。例如:.net
type City string func (c City) String() string { return fmt.Sprintf("%s", c) }
许多类型都会定义String方法,由于当使用fmt包的打印方法时,将会优先使用该类型的String方法返回结果,进行打印。code
由此引出:blog
// json包 func Marshal(v interface{}) (data []byte, err error) func Unmarshal(data []byte, v interface{}) error // 序列化interface type Marshaler interface { MarshalJSON() ([]byte, error) } // 反序列化interface type Unmarshaler interface { UnmarshalJSON([]byte) error }
在进行json序列化和反序列化时,若是数据类型本身定义了序列化和反序列化行为。则咱们在json.Marshal(data)
和json.Unmarshal(data, v)
时,遇到这种数据数据,默认会使用自定义的序列化和反序列化。例如:get
type SaleOrder struct { CreatedAt CustomTime `json:"created_at"` SaleOrderId int `json:"sale_order_id"` } type CustomTime time.Time func (c *CustomTime) MarshalJSON() ([]byte, error) { ... } func (c *CustomeTime) UnmarshalJSON(data []byte, v interface{}) error{ ... } // 则咱们在反序列化[]byte时 so :=&SaleOrder{ CreatedAt: "2017-10-21", SaleOrderId: 1234, } // 会调用CustomTime的序列化方法 if bts, err:= json.Marshal(so); err !=nil{ log.Fatal(err.Error()) return } // 会调用CustomTime的反序列化方法 if err = json.Unmarshal(bts, so); err !=nil{ log.Fatal(err.Error()) return }
经验总结:咱们之后遇到须要对数据进行处理的时候,若是当前的处理不支持,能够查看是否有处理的interface类型,有的话,就自定义实现。string