我正在嘗試測試模板生成工具。為了做到這一點,我認為捕獲模板執(zhí)行輸出的最簡單方法是使用 io writer 并在測試期間提供它。問題是由于某些原因,接收器沒有用模板輸出“更新”。希望下面的代碼更好地解釋了我面臨的問題。package mainimport "fmt"import "text/template"type Company struct{ Name string} type Companies []Companyfunc main() { s := new(stringer) v := Companies{Company{Name:"Sony"}} tmp := template.Must(template.New("main").Parse(src)) if err := tmp.Execute(s, v); err !=nil{ panic(err) } if *s != "this is the header template"{ fmt.Println("expected: \"this is the header template\" received: ", *s) }else{ fmt.Println("s is %v", *s) }}type stringer stringfunc (s *stringer)Write(b []byte)(int, error){ *s = stringer(b) return len(b), nil}var src = ` this is the header template {{range .}} {{.Name}} {{end}}`http://play.golang.org/p/y4zWgyd5G1
1 回答

桃花長相依
TA貢獻1860條經(jīng)驗 獲得超8個贊
您的stringer
類型只是輸入的“別名” *string
。string
在 Go 中是不可變的。您不應該使用 astring
或指向 a 的指針來string
構建模板的輸出,因為您不能修改 a string
,您只能創(chuàng)建一個新的(并丟棄舊的)。
template.Execute()
期待一個io.Writer
. Write()
輸出的方法可能會被多次調用,并且您的stringer.Write()
方法總是會丟棄之前寫入它的數(shù)據(jù)。您可以通過始終將新數(shù)據(jù)連接到舊數(shù)據(jù)來修復它,如下所示:
*s = *s + stringer(b)
但是這個解決方案非常低效(它生成新string
的并丟棄舊的)。
一個更好且隨時可用的替代方案是bytes.Buffer
. 您可以創(chuàng)建一個字節(jié)緩沖區(qū)來實現(xiàn)這樣的Writer
接口:
bytes.NewBuffer(nil)
您不需要創(chuàng)建自己的stringer
類型。在Go Playground上試試你修改過的程序。
- 1 回答
- 0 關注
- 174 瀏覽
添加回答
舉報
0/150
提交
取消