我正在尝试使用json.Unmarshaler接口将UUID解组为结构上的uuid.UUID字段。我创建了一个名为myUUID的自定义类型,一切正常,直到我尝试访问通常在uuid.UUID上的方法。我怎么处理这个?我对Go来说比较新,所以也许我还没有完全理解自定义类型。
package main
import (
"encoding/json"
"errors"
"fmt"
"code.google.com/p/go-uuid/uuid"
)
var jsonstring = `
{
"uuid": "273b62ad-a99d-48be-8d80-ccc55ef688b4"
}
`
type myUUID uuid.UUID
type Data struct {
uuid myUUID
}
func (u *myUUID) UnmarshalJson(b []byte) error {
id := uuid.Parse(string(b[:]))
if id == nil {
return errors.New("Could not parse UUID")
}
*u = myUUID(id)
return nil
}
func main() {
d := new(Data)
err := json.Unmarshal([]byte(jsonstring), &d)
if err != nil {
fmt.Printf("%s", err)
}
fmt.Println(d.uuid.String())
}
答案 0 :(得分:6)
您可能希望确保myuuid
中的Data struct
变量可见/导出:如“公共”中所示。
类别别名MyUUID
(而不是myUUID
)
type MyUUID uuid.UUID
type Data struct {
Uuid MyUUID
}
来自JSON and Go:
json包只访问struct类型的导出字段(以大写字母开头的字段)。
commented Ainar G style guide,{{3}}也建议:
名称中的单词是首字母缩略词或首字母缩写词(例如“
URL
”或“NATO
”)具有一致的情况。
例如,“URL
”应显示为“URL
”或“url
”(如“urlPony
”或“URLPony
”),作为“Url
”。以下是一个示例:ServeHTTP
而非ServeHttp
。此规则也适用于“
ID
”,当它是“标识符”的缩写时,请写“appID
”而不是“appId
”。
在您的情况下,这意味着:
type Data struct {
UUID MyUUID
}
答案 1 :(得分:3)
Go自定义类型don't inherit methods。我使用自定义结构重构代码并附加UnmarshalJSON。
type ServiceID struct {
UUID uuid.UUID
}
type Meta struct {
Name string `json:"name"`
Version string `json:"version"`
SID *ServiceID `json:"UUID"`
}
func (self *ServiceID) UnmarshalJSON(b []byte) error {
s := strings.Trim(string(b), "\"")
self.UUID = uuid.Parse(s)
if self.UUID == nil {
return errors.New("Could not parse UUID")
}
return nil
}