2016-06-30 7 views
0
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 FullNameGoの属性に直接アクセスするのではなく、メソッドをトリガする方法は?

例のユースケース:

姓名

は、DBに保持されますが、完全な名前ではありません。 User構造体のフルネームフィールドにアクセスするだけでは、ユーザーのフルネームは正しく返されません。

もう1つの例は、jsonにシリアル化するときに完全な名前が空白になる場合です。私が次のようなことをしない限り:

func (u *User) SetFullName() string { 
    u.FullName = u.FirstName + " " + u.LastName 
} 

user.SetFullName() 

// serialize to json and return an http response... 

私はそれを自動的に行う方法があるのだろうかと思います。

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

+2

なぜ 'FullName'フィールドがありますか? – user2357112

+0

@ user2357112私の質問が更新されました。 –

+0

"このコード行が必要です:user.FullName to call ...":Goに "I want"はありません。 – Volker

答えて

2

私の知る限りでは、あなたはもともと求めているものを行うことはできませんが、あなたのJSONをマーシャリングすると、あなたの問題を解決するために、あなたはそうのようなカスタムMarshalJSONメソッドを実装することができ

あなたは1を無視していなかった場合は、2つのfull_nameフィールドを持つことになりますので、あなたがしたい場合User構造体からFullNameを削除し、ちょうどMarshalJSONでそれを残すことができる..私はjson:"-"を追加しました。

+0

素晴らしい!ありがとう!フルネームにアクセスしたい場合は、User構造体にGetFullName()メソッドを追加するだけです。また、MarshalJSONメソッドのGetFullName()メソッドを使用して、フルネームの生成が重複しないようにする - https://play.golang.org/p/Png5-orZ_Y –

関連する問題