2

次のコードでは、構造をきれいに出力する Txt() 関数を記述しようとしています。完全なコードには、次の小さな質問が含まれています。

  1. Char配列を文字列で初期化する一行の書き方(47行目)
  2. 文字列関数なしで Char 型のチェックを高速化する方法 (29,30 行目)
  3. Char 配列を文字列として出力する方法 (32 行目)
  4. Char を文字列として出力するには、おそらく 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")

}
4

1 に答える 1

1

このコードは、関数が可変長の配列を返すことができず、Go には動的に派生したサイズの配列を初期化する機能がないため、最初の質問を除いてすべて答える必要があります。それらにはスライスが必要です。コードの残りの部分は、慣用的な go と Stringer インターフェイスを使用して解決でき、リフレクションは必要ありません。

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\n", th)
    tb := TBody{B2: [4]Char{'A', 'B', 'C', 'D'}}
    fmt.Printf("%#v\n", tb)
    fmt.Printf("Txt(th):\n%s\n", th)
    fmt.Printf("Txt(tb):\n%s\n", tb)

}
于 2013-05-21T18:52:51.470 に答える