2017-09-18 3 views
0
type Social struct { 
    XMLName xml.Name `xml:"social"` 
    Facebook string `xml:"facebook"` 
    Twitter string `xml:"twitter"` 
    Youtube string `xml:"youtube"` 
} 

위의 예에서 나는 복수 구조체에 xml:"facebook"을 재사용했습니다. 상수로 추출하고 모든 구조체에서 참조 할 수 있는지 알고 싶습니다.GoLang : 구조체에서 xml 태그 정의 리펙토링

또는 내가 specs/documents를 통해 읽은 구조체를 정의해야하고이를 달성하는 특정 방법을 찾지 못했습니다.

가능합니까?

추신 : 내 의도는 새로운 구조체를 만들 때 잘못 입력하기 쉽기 때문에 중복 코드를 줄이는 것이 었습니다 (몇 번 나 일어난 것처럼).

답변

2

필요할 때마다 tag을 반복하는 것이 두통이 아닙니다. struct 필드에 대한 태그를 정의 할 때이 스펙에서는 상수 나 변수를 사용할 수 없습니다. struct 태그는 string literal 일 수 있습니다. Spec: Struct types:

StructType = "struct" "{" { FieldDecl ";" } "}" . 
FieldDecl  = (IdentifierList Type | EmbeddedField) [ Tag ] . 
EmbeddedField = [ "*" ] TypeName . 
Tag   = string_lit . 

방법 중 하나에서 인용하면 태그 정의가 다른 구조체로 전체 구조체 필드를 "아웃소싱"하는 것 "아웃소싱"및 Social이 구조체 것을 포함해야합니다.

예를 들어

:

type Social struct { 
    XMLName xml.Name `xml:"social"` 
    HasFacebook 
    Twitter string `xml:"twitter"` 
    Youtube string `xml:"youtube"` 
} 

type HasFacebook struct { 
    Facebook string `xml:"facebook"` 
} 

을 그리고 지금은 다른 유형/구조체에 다시 사용할 수 있습니다 :

type Social2 struct { 
    HasFacebook 
    Linkedin string `xml:"linkedin"` 
} 

시험 두 가지 유형 (SocialSocial2) :

func main() { 
    var s *Social 
    if err := xml.Unmarshal([]byte(src), &s); err != nil { 
     panic(err) 
    } 
    fmt.Printf("%+v\n", s) 

    var s2 *Social2 
    if err := xml.Unmarshal([]byte(src), &s2); err != nil { 
     panic(err) 
    } 
    fmt.Printf("%+v\n", s2) 
} 

const src = `<social> 
    <facebook>someface</facebook> 
    <twitter>sometwitter</twitter> 
    <linkedin>somelinkedin</linkedin> 
</social>` 

출력 (시도해보십시오 Go Playground) :

&{XMLName:{Space: Local:social} HasFacebook:{Facebook:someface} Twitter:sometwitter Youtube:} 
&{HasFacebook:{Facebook:someface} Linkedin:somelinkedin} 
+0

그건 좋은 제안이야 (y) –

1

가능합니까?

아니요. 불가능합니다.

+0

물론 그렇습니다. –