上一篇 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