如何漂亮地打印字节数组和char数组?

In the following code, I'm trying to write a Txt() function to pretty print out my structure. It contains following minor questions in the full code:

  1. How to write one line to initialize Char array by string(line 47)
  2. How to speed up checking Char type without strings function(line 29,30)
  3. How to print out Char array as string(line 32)
  4. How to print out Char as string, maybe use Sprintf("%c"), but it is very slow.(line 34)

full code at: 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) + "
"
      } else {
        s += fmt.Sprint(valfld.Interface()) + "
"
      }
    } else {
      s += fmt.Sprint(valfld.Interface()) + "
"
    }
  }
  return
}

func main() {
    th := THeader{1, 'H'}
    fmt.Printf("%#v
", th)
    //  tb := TBody{B2: [10]Char("ABCD")}
    tb := TBody{B2: [4]Char{'A', 'B', 'C', 'D'}}
    fmt.Printf("%#v
", tb)
    fmt.Print("Txt(th):
", Txt(th), "
")
    fmt.Print("Txt(tb):
", Txt(tb), "
")

}

This code should answer all except for your 1'st questions which is impossible since a function can't return arrays of varying length and Go has no facility to initialize an array of dynamically derived sizes. You need slices for those. The rest of the code is solveable using idiomatic go with the Stringer interface and no reflection required.

package main

import (
    "fmt"
)

type Char byte
type CharSlice []Char
type ByteSlice []byte

func (s CharSlice) String() string {
    ret := "\""
    for _, b := range s {
        ret += fmt.Sprintf("%c", b)
    }
    ret += "\""
    return ret
}

func (s ByteSlice) String() string {
    return fmt.Sprintf("%v", []byte(s))
}

type THeader struct {
    Ver int8 // will show 1
    Tag Char // will show 'H'
}

func (t THeader) String() string {
    return fmt.Sprintf("{ Ver: %d, Tag: %c}", t.Ver, t.Tag)
}

type TBody struct {
    B1 [3]byte // will show "[0,0,0]"
    B2 [4]Char // will show "ABCD"
}

func (t TBody) String() string {
    return fmt.Sprintf("{ B1: %s, B2: %s", ByteSlice(t.B1[:]), CharSlice(t.B2[:]))
}

func main() {
    th := THeader{1, 'H'}
    fmt.Printf("%#v
", th)
    tb := TBody{B2: [4]Char{'A', 'B', 'C', 'D'}}
    fmt.Printf("%#v
", tb)
    fmt.Printf("Txt(th):
%s
", th)
    fmt.Printf("Txt(tb):
%s
", tb)

}