This is an automated email from the ASF dual-hosted git repository.

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory.git


The following commit(s) were added to refs/heads/main by this push:
     new cf57fe5a1 feat(go): update float16 array/slice logic in 
createSerializer (#3318)
cf57fe5a1 is described below

commit cf57fe5a1531bda2ccdfd6db3506938704b25b87
Author: Chang-Yen (Brian) Li <[email protected]>
AuthorDate: Tue Feb 10 03:14:13 2026 -0600

    feat(go): update float16 array/slice logic in createSerializer (#3318)
    
    ## Why?
    
    To handle `float16` arrays and slices in a cleaner way during
    serialization and deserialization in the Go.
    
    ## What does this PR do?
    
    - Modified the `createSerializer` function in `go/fory/type_resolver.go`
    to correctly return `float16SliceSerializer` for `reflect.Slice` of
    `float16` and `float16ArraySerializer` for `reflect.Array` of `float16`.
    - Added tests in `type_test.go` to validate this behavior.
    
    ## Related issues
    
    
    
    #3235 implementation for `float16` support
    #3310 `bfloat` implementation that aligns with this PR
    
    ## Does this PR introduce any user-facing change?
    
    
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    ## Benchmark
---
 go/fory/type_resolver.go |  7 ++--
 go/fory/type_test.go     | 90 +++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 94 insertions(+), 3 deletions(-)

diff --git a/go/fory/type_resolver.go b/go/fory/type_resolver.go
index 3363508ed..b10a134d8 100644
--- a/go/fory/type_resolver.go
+++ b/go/fory/type_resolver.go
@@ -1708,6 +1708,10 @@ func (r *TypeResolver) createSerializer(type_ 
reflect.Type, mapInStruct bool) (s
                        // []byte uses byteSliceSerializer
                        return byteSliceSerializer{}, nil
                case reflect.Uint16:
+                       // Check for fory.Float16 (aliased to uint16)
+                       if elem == float16Type {
+                               return float16SliceSerializer{}, nil
+                       }
                        return uint16SliceSerializer{}, nil
                case reflect.Uint32:
                        return uint32SliceSerializer{}, nil
@@ -1756,8 +1760,7 @@ func (r *TypeResolver) createSerializer(type_ 
reflect.Type, mapInStruct bool) (s
                        return int32ArraySerializer{arrayType: type_}, nil
                case reflect.Uint16:
                        // Check for fory.Float16 (aliased to uint16)
-                       // Check name first to avoid slow PkgPath call
-                       if elem.Name() == "Float16" && (elem.PkgPath() == 
"github.com/apache/fory/go/fory/float16" || strings.HasSuffix(elem.PkgPath(), 
"/float16")) {
+                       if elem == float16Type {
                                return float16ArraySerializer{arrayType: 
type_}, nil
                        }
                        return uint16ArraySerializer{arrayType: type_}, nil
diff --git a/go/fory/type_test.go b/go/fory/type_test.go
index 952a3882c..5b9766930 100644
--- a/go/fory/type_test.go
+++ b/go/fory/type_test.go
@@ -18,9 +18,11 @@
 package fory
 
 import (
-       "github.com/stretchr/testify/require"
        "reflect"
        "testing"
+
+       "github.com/apache/fory/go/fory/float16"
+       "github.com/stretchr/testify/require"
 )
 
 func TestTypeResolver(t *testing.T) {
@@ -62,3 +64,89 @@ func TestTypeResolver(t *testing.T) {
                require.Equal(t, test.type_, type_)
        }
 }
+
+func TestCreateSerializerSliceTypes(t *testing.T) {
+       fory := NewFory()
+       r := newTypeResolver(fory)
+
+       tests := []struct {
+               sliceType              reflect.Type
+               expectedSerializerType reflect.Type
+       }{
+               {reflect.TypeOf([]bool{}), 
reflect.TypeOf(boolSliceSerializer{})},
+               {reflect.TypeOf([]int8{}), 
reflect.TypeOf(int8SliceSerializer{})},
+               {reflect.TypeOf([]int16{}), 
reflect.TypeOf(int16SliceSerializer{})},
+               {reflect.TypeOf([]int32{}), 
reflect.TypeOf(int32SliceSerializer{})},
+               {reflect.TypeOf([]int64{}), 
reflect.TypeOf(int64SliceSerializer{})},
+               {reflect.TypeOf([]float32{}), 
reflect.TypeOf(float32SliceSerializer{})},
+               {reflect.TypeOf([]float64{}), 
reflect.TypeOf(float64SliceSerializer{})},
+               {reflect.TypeOf([]int{}), reflect.TypeOf(intSliceSerializer{})},
+               {reflect.TypeOf([]uint{}), 
reflect.TypeOf(uintSliceSerializer{})},
+               {reflect.TypeOf([]uint16{}), 
reflect.TypeOf(uint16SliceSerializer{})},
+               {reflect.TypeOf([]float16.Float16{}), 
reflect.TypeOf(float16SliceSerializer{})},
+               {reflect.TypeOf([]uint32{}), 
reflect.TypeOf(uint32SliceSerializer{})},
+               {reflect.TypeOf([]uint64{}), 
reflect.TypeOf(uint64SliceSerializer{})},
+               {reflect.TypeOf([]string{}), 
reflect.TypeOf(stringSliceSerializer{})},
+       }
+
+       for _, test := range tests {
+               serializer, err := r.createSerializer(test.sliceType, false)
+               if err != nil {
+                       t.Fatalf("Failed to create serializer for %s: %v", 
test.sliceType, err)
+               }
+
+               if reflect.TypeOf(serializer) != test.expectedSerializerType {
+                       t.Errorf("For type %s, expected serializer of type %s, 
got %T", test.sliceType, test.expectedSerializerType, serializer)
+               }
+       }
+}
+
+func TestCreateSerializerArrayTypes(t *testing.T) {
+       fory := NewFory()
+       r := newTypeResolver(fory)
+
+       var expectedIntArraySerializerType reflect.Type
+       if reflect.TypeOf(int(0)).Size() == 8 {
+               expectedIntArraySerializerType = 
reflect.TypeOf(int64ArraySerializer{})
+       } else {
+               expectedIntArraySerializerType = 
reflect.TypeOf(int32ArraySerializer{})
+       }
+
+       var expectedUintArraySerializerType reflect.Type
+       if reflect.TypeOf(uint(0)).Size() == 8 {
+               expectedUintArraySerializerType = 
reflect.TypeOf(uint64ArraySerializer{})
+       } else {
+               expectedUintArraySerializerType = 
reflect.TypeOf(uint32ArraySerializer{})
+       }
+
+       tests := []struct {
+               arrayType              reflect.Type
+               expectedSerializerType reflect.Type
+       }{
+               {reflect.TypeOf([4]bool{}), 
reflect.TypeOf(boolArraySerializer{})},
+               {reflect.TypeOf([4]int8{}), 
reflect.TypeOf(int8ArraySerializer{})},
+               {reflect.TypeOf([4]int16{}), 
reflect.TypeOf(int16ArraySerializer{})},
+               {reflect.TypeOf([4]int32{}), 
reflect.TypeOf(int32ArraySerializer{})},
+               {reflect.TypeOf([4]int64{}), 
reflect.TypeOf(int64ArraySerializer{})},
+               {reflect.TypeOf([4]float32{}), 
reflect.TypeOf(float32ArraySerializer{})},
+               {reflect.TypeOf([4]float64{}), 
reflect.TypeOf(float64ArraySerializer{})},
+               {reflect.TypeOf([4]int{}), expectedIntArraySerializerType},
+               {reflect.TypeOf([4]uint{}), expectedUintArraySerializerType},
+               {reflect.TypeOf([4]byte{}), 
reflect.TypeOf(uint8ArraySerializer{})},
+               {reflect.TypeOf([4]uint16{}), 
reflect.TypeOf(uint16ArraySerializer{})},
+               {reflect.TypeOf([4]float16.Float16{}), 
reflect.TypeOf(float16ArraySerializer{})},
+               {reflect.TypeOf([4]uint32{}), 
reflect.TypeOf(uint32ArraySerializer{})},
+               {reflect.TypeOf([4]uint64{}), 
reflect.TypeOf(uint64ArraySerializer{})},
+       }
+
+       for _, test := range tests {
+               serializer, err := r.createSerializer(test.arrayType, false)
+               if err != nil {
+                       t.Fatalf("Failed to create serializer for %s: %v", 
test.arrayType, err)
+               }
+
+               if reflect.TypeOf(serializer) != test.expectedSerializerType {
+                       t.Errorf("For type %s, expected serializer of type %s, 
got %T", test.arrayType, test.expectedSerializerType, serializer)
+               }
+       }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to