2017-12-25 8 views
-2

私はreading aboutタイプエイリアスとGolangで構成された構造体でした。私は、構造的には同じですが、お互いに簡単に変換できる2つの構造体を持つことができるようにしたいと考えています。Golangでコンバートタイプを変更

私のように定義された親構造を有する:私はUserを定義した場合、その期待

type PublicUser struct { 
    *User 
} 

type User struct { 
    Email string `json:"email"` 
    Password string `json:"password"` 
} 

、以下のように定義合成構造体を

a := User{ 
     Email: "[email protected]", 
     Password: "1234", 
    } 

次に、次の型変換を実行できます:

b := (a).(PublicUser) 

しかし、それは無効な型アサーションで失敗します。

invalid type assertion: a.(PublicUser) (non-interface type User on left) 

私は行くに構造的に類似のタイプの間で変換することができますどのように?移動中

https://play.golang.org/p/I0VqrflOfXU

+0

"私は親の構造が定義されています"。いいえ、あなたはしません。 Goには_no_親子関係があります。それは今と永遠に忘れてください。親子関係の構図を考えることは役に立ちません。 – Volker

+0

ちょっとOP、あなたが答えがあなたが望んでいないと決めた理由を説明する気に?あなたは一度それを受け入れたので、あなたがいくつかの情報を見つけたら、私は興味があります –

答えて

1

タイプのアサーションは、あなたがいない構造体の中に、インタフェースのコンクリートの型にタップしてみましょう:

型アサーションは、インタフェース値の基礎となる具体的な値へのアクセスを提供します。
https://tour.golang.org/methods/15

しかし、若干の修正を加えて、このコードは動作し、おそらくあなたが期待するように動作します。

ここ
package main 

import (
    "fmt" 
) 

type User struct { 
    Email string `json:"email"` 
    Password string `json:"password"` 
} 

type PublicUser User 

func main() { 
    a := User{ 
     Email: "[email protected]", 
     Password: "1234", 
    } 
    fmt.Printf("%#v\n", a) 
    // out: User{Email:"[email protected]", Password:"1234"} 

    b := PublicUser(a) 
    fmt.Printf("%#v", b) 
    // out PublicUser{Email:"[email protected]", Password:"1234"} 
} 

PublicUserUserタイプの再定義です。最も重要なのは、スタンドアロンタイプで、フィールドを共有しますが、User(https://golang.org/ref/spec#Type_definitions)のメソッドセットを共有しないことです。

次に、string/[]byteのコンバージョン数:foo := []byte("foobar")と同様に、PublicUserタイプのコンストラクタを使用できます。

一方で、あなたは実際のtype aliasを使用した、場合(type PublicUser = User)あなたの出力は、両方のインスタンスのタイプとしてUserを一覧表示されます:PublicUserは古いもののためだけに新しい名前ではなく、新しいタイプです。

関連する問題