gorm兼容net.IP類

首先 alias net.IP類到本地包,為之後實作方法。


type IP net.IP

因為pg不能直接使用[]byte作為輸入,所以需要實作Value()令Gorm 能轉換成字串作為輸入。

先從自定義的 IP 類轉換回 net.IP 類,再用 String() 轉成字串。




func (a IP) Value() (driver.Value, error) {
return net.IP(a).String(), nil
}

別外,由於從pg 內讀取出來的是 []unit8 類,內部數據是 ASIIC 碼,所以先轉換成 byte合併成 Array 再轉成 string.

最後用 net 庫內的 ParseIP 方法 轉成 IP 類,之後再 cast 成自定義的 IP 類 返回。



















type IP net.IP

func (a *IP) Scan(src interface{}) error {
switch x := src.(type) {
case []uint8:
*a = IP(net.ParseIP(string(x)))
return nil
case nil:
*a = nil
return nil
}

return fmt.Errorf("pq: cannot convert %T to net.IP", src)
}

func (a IP) Value() (driver.Value, error) {
return net.IP(a).String(), nil
}