2017-12-25 9 views
-2

나는 Golang의 reading about 유형 별칭 및 구성된 구조체였습니다. 나는 구조적으로 동일하지만 쉽게 서로간에 변환 될 수있는 두 개의 구조체를 가질 수 있기를 원합니다. 로 정의Golang에서 변경 한 구성 유형

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

그리고 합성 구조체 :로

나는 부모 구조가 정의되어

type PublicUser struct { 
    *User 
} 

내가 기대하는 나는 User 정의하는 경우 :

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

"부모가 정의되었습니다." 아니야. 이동에 _no_ 부모/자식 관계가 있습니다. 이제는 영원히 잊어 버려라. 부모/자녀로서 작곡을 생각하는 것은 도움이되지 않습니다. – Volker

+0

안녕하세요 OP, 왜 대답이 당신이 원하는 것이 아니라고 결정했는지 설명해 주시겠습니까? 한번 받아 들였 잖아. 그래서 정보를 찾으면 궁금 하네. –

답변

1

유형의 주장은하지 구조체로, 인터페이스의 구체적인 유형을 활용하자 :

유형의 주장은 인터페이스 값의 기본 콘크리트 값에 대한 액세스를 제공합니다. PublicUserUser 유형의 재정이다, 여기에

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"} 
} 

;
https://tour.golang.org/methods/15

그러나, 약간의 수정과 함께, 아마 코드 작품이 사용자가 예상하는대로 동작 가장 중요한 것은 독립 실행 형 유형으로 필드를 공유하지만 사용자 (https://golang.org/ref/spec#Type_definitions)의 메서드 집합은 공유하지 않습니다. foo := []byte("foobar")을 : 당신이 string/[]byte 변환과 유사하고있다 하듯

다음, 당신은 단순히 PublicUser 타입 생성자를 사용할 수 있습니다.

다른 한편으로는, 당신은 두 인스턴스에 대한 유형으로 User을 나열합니다 실제 type alias (type PublicUser = User) 당신의 출력을 사용했다, 경우 PublicUser는 오래된 물건 만 새 이름이 아닌 새로운 유형입니다.