2014-11-25 1 views
1

Go 템플릿에 내용을 추가하지만 템플릿의 특정 섹션 내에 내용을 추가하는 데 관심이 있습니다.특정 섹션 내의 Go 템플릿에 내용 추가

예 서식 :

type Client struct { 
    Opts *ClientOpts 
    Schemas *Schemas 
    Types map[string]Schema 

    Container *{{.schema.Id}}Client 

    } 

실제 출력 :

템플릿 I 템플릿을 실행에 새로운 컨텐츠를 추가하려고 할 때마다 형성되는 구조를 가지고 있기 때문에, 이전에 실행 된 템플릿 콘텐츠에 새로운 컨텐츠를 추가
type Client struct { 
     Opts *ClientOpts 
     Schemas *Schemas 
     Types map[string]Schema 

     Container *abcClient 

     } 

type Client struct { 
     Opts *ClientOpts 
     Schemas *Schemas 
     Types map[string]Schema 

     Container *xyzClient 

     } 
} 

원하는 출력 :

type Client struct { 
     Opts *ClientOpts 
     Schemas *Schemas 
     Types map[string]Schema 

     Container *abcClient 
     Container *xyzClient 

     } 

나의 현재 이동 코드는 다음과 같습니다 : 내가 생각할 수있는

func appendToFile(filename string, template *template.Template, schema client.Schema) error { 
    output, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0600) 
    if err != nil { 
     panic(err) 
    } 
    defer output.Close() 

    data := map[string]interface{}{ 
     "schema": schema, 
    } 
    err = template.Execute(output, data) 
    return err 

} 

하나의 솔루션은 이전에 추가 컨텐츠에 대한 모든 시간을 추구하고 거기에 새로운 콘텐츠를 작성하는 것입니다. 그러나 나는 Go에서 그렇게하는 방법을 모르겠습니다. 누군가가 저에게 코드 스 니펫을 제공하거나 더 나은 전략을 제안 할 수 있습니까?

+0

Go와 함께 제공되는 parser/ast 패키지를 보시지 않겠습니까? 당신은 노드를 생성하고 그 결과를 당신에게 뱉어 낼 수 있습니다. –

+0

이 질문은 잘못된 것 같습니다. 정의에 따라 추가는 버퍼 끝에 내용을 추가하는 것을 의미합니다. 그 대신에, 템플릿 내에 추가 컨텐츠를 추가 할 수 있기를 원합니다. 대신에'client.Schema' 슬라이스에 범위를 두지 않으시겠습니까? – djd

답변

3

대신 데이터를 추가의 템플릿 중 하나 개를 실행하여 출력을 생성 :

package main 

import (
    "fmt" 
    "os" 
    "text/template" 
) 

var t = template.Must(template.New("").Parse(` type Client struct { 
    Opts *ClientOpts 
    Schemas *Schemas 
    Types map[string]Schema 

{{range .}} 
    Container *{{.schema.Id}}Client{{end}} 

} 
`)) 

type schema struct { 
    Id string 
} 

func main() { 
    data := []map[string]interface{}{ 
     {"schema": schema{Id: "abcClient"}}, 
     {"schema": schema{Id: "xyzClient"}}, 
    } 
    if err := t.Execute(os.Stdout, data); err != nil { 
     fmt.Println(err) 
    } 
} 

Try it on the playground한다.

+0

의견을 주셔서 감사합니다. 나는 실제로 그 일을 끝내기를 반복했다. – psbits

+0

지도의 키를 사용하지 않으므로 실제로지도를 사용할 필요가 없습니다. 단지 [[] Schema'만으로 충분할 것입니다. – djd

+0

템플릿에 전달 된 콘텐츠의 범위를 정할 때 콘텐츠를 필터링하는 방법이 있습니까? 이 스키마가 100 개 있다고 상상해보십시오.하지만 그 중 일부를 필터링하는 데 관심이 있습니다. – psbits