2
在下面的代碼中,我試圖編寫一個Txt()函數來打印出我的結構。它包含以下的完整代碼小問題:如何漂亮地打印字節數組和字符數組?
- 如何寫一行通過字符串初始化字符數組(47行)
- 如何加快檢查char類型無弦函數(線29,30)
- 如何打印出字符陣列串(第32行)
- 如何打印出字符字符串,也許用sprintf(「%C」),但它是非常緩慢的。(第34行)
完整代碼在:http://play.golang.org/p/nUsg_qbufP
type Char byte
type THeader struct {
Ver int8 // will show 1
Tag Char // will show 'H'
}
type TBody struct {
B1 [3]byte // will show "[0,0,0]"
B2 [4]Char // will show "ABCD"
}
func Txt(t interface{}) (s string) {
val := reflect.ValueOf(t)
typ := val.Type()
fields := typ.NumField()
for i := 0; i < fields; i++ {
sf := typ.Field(i)
valfld := val.Field(i)
vType := valfld.Type()
s += sf.Name + ":" + vType.String() + ":"
if strings.HasSuffix(vType.String(), "Char") {
if strings.HasPrefix(vType.String(), "[") {
v, ok := valfld.Interface().([4]Char)
s += fmt.Sprint(ok, v) + "\n"
} else {
s += fmt.Sprint(valfld.Interface()) + "\n"
}
} else {
s += fmt.Sprint(valfld.Interface()) + "\n"
}
}
return
}
func main() {
th := THeader{1, 'H'}
fmt.Printf("%#v\n", th)
// tb := TBody{B2: [10]Char("ABCD")}
tb := TBody{B2: [4]Char{'A', 'B', 'C', 'D'}}
fmt.Printf("%#v\n", tb)
fmt.Print("Txt(th):\n", Txt(th), "\n")
fmt.Print("Txt(tb):\n", Txt(tb), "\n")
}
「漂亮」包 - https://github.com/kr/pretty - 可能會給你一些有用的想法。 – 2013-04-08 03:45:00
如果您使用切片而不是數組([] Char而不是[4] Char),則一切都會更容易。我假設你希望通過使用數組來獲得性能? – 2013-04-08 06:51:02
我已經介紹了漂亮的代碼。我使用[4] Char而不是[] Char,因爲我想讀取網絡流,它需要特定的固定大小才能使用binary.Read()。 – 2013-04-08 07:21:09