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