如何触发方法而不是直接访问Go中的属性?

时间:2016-06-30 03:14:57

标签: go

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...

我想知道是否有办法自动完成。

1 个答案:

答案 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字段,如果您没有忽略该字段。