Go聖經-學習筆記之程序結構(二)

上一篇 Go聖經-學習筆記之程序結構golang

下一篇 Go聖經-學習筆記之基礎數據類型json

由類型引出的interface處理

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

相關文章
相關標籤/搜索