type User struct {
FullName string
FirstName string
LastName string
}
func (u *User) FullName() string {
return u.FirstName + " " + u.LastName
}
我想要这行代码:user.FullName
来调用FullName方法而不是直接访问FullName属性。 Go中有没有办法做到这一点?这个例子会抛出这样的错误:type User has both field and method named FullName
示例用例:
名字和姓氏都保存在数据库中,但全名不是。如果我只是访问User结构的全名字段,它将无法正确返回用户的全名。
另一个例子是将它序列化为json时,全名将为空白。除非我这样做:
func (u *User) SetFullName() string {
u.FullName = u.FirstName + " " + u.LastName
}
user.SetFullName()
// serialize to json and return an http response...
我想知道是否有办法自动完成。
答案 0 :(得分:2)
据我所知,你不能做你原先要求的事情,但是要通过编组你的json解决你的问题,你可以实现一个自定义的MarshalJSON
方法:
type User struct {
FullName string `json:"-"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
}
func (u *User) MarshalJSON() ([]byte, error) {
type Alias User
return json.Marshal(&struct {
FullName string `json:"full_name"`
*Alias
}{
FullName: fmt.Sprintf("%s %s", u.FirstName, u.LastName),
Alias: (*Alias)(u),
})
}
游乐场:https://play.golang.org/p/M-CVqzTT7B
如果您愿意,可以从FullName
结构中移除User
,然后将其保留在MarshalJSON
中..我添加了json:"-"
,因为您将拥有2 full_name
ng-show
字段,如果您没有忽略该字段。