diff --git a/thrift/binary.go b/thrift/binary.go index b0c987a0..70bb1ab4 100644 --- a/thrift/binary.go +++ b/thrift/binary.go @@ -1311,6 +1311,10 @@ func GoType2ThriftType(val interface{}) Type { if ok { return STRUCT } + _, ok = val.([]byte) + if ok { + return STRING + } switch reflect.TypeOf(val).Kind() { case reflect.Bool: return BOOL diff --git a/thrift/generic/example_test.go b/thrift/generic/example_test.go index 83d88cee..7c22cad7 100644 --- a/thrift/generic/example_test.go +++ b/thrift/generic/example_test.go @@ -2,6 +2,7 @@ package generic import ( "fmt" + "reflect" "github.com/cloudwego/dynamicgo/thrift" ) @@ -10,6 +11,44 @@ var opts = &Options{ UseNativeSkip: true, } +func ExampleNewTypedNode() { + // make a map> node + ret := NewTypedNode(thrift.MAP, thrift.LIST, thrift.STRING, PathNode{ + Path: NewPathStrKey("1"), + Node: NewNodeList([]interface{}{int32(1), int32(2)}), + }) + + // print raw data + fmt.Printf("buf:%+v\n", ret.Raw()) + + // print interface + val, err := ret.Interface(opts) + fmt.Printf("val:%#v\n", val) + if err != nil { + panic(err) + } + if !reflect.DeepEqual(val, map[string]interface{}{"1": []interface{}{int(1), int(2)}}) { + panic("not equal") + } + + // make a struct{1:map} node + ret = NewTypedNode(thrift.STRUCT, 0, 0, PathNode{ + Path: NewPathFieldId(1), + Node: NewNodeMap(map[interface{}]interface{}{"1": []byte{1}}), + }) + // print interface + opts.CastStringAsBinary = true + opts.MapStructById = true + val, err = ret.Interface(opts) + fmt.Printf("val:%#v\n", val) + if err != nil { + panic(err) + } + if !reflect.DeepEqual(val, map[thrift.FieldID]interface{}{thrift.FieldID(1): map[string]interface{}{"1": []byte{1}}}) { + panic("not equal") + } +} + func ExampleValue_SetByPath() { // pack root value desc := getExampleDesc()