diff --git a/cursor/encoder_test.go b/cursor/encoder_test.go index 722bebe..60b7696 100644 --- a/cursor/encoder_test.go +++ b/cursor/encoder_test.go @@ -51,3 +51,9 @@ func (s *encoderSuite) TestZeroValuePtr() { _, err := e.Encode(struct{ ID *string }{}) s.Nil(err) } + +func (s *encoderSuite) TestSliceValue() { + e := NewEncoder([]EncoderField{{Key: "Slice"}}) + _, err := e.Encode(struct{ Slice []string }{Slice: []string{"value"}}) + s.Nil(err) +} diff --git a/cursor/encoding_test.go b/cursor/encoding_test.go index b277632..7a0d112 100644 --- a/cursor/encoding_test.go +++ b/cursor/encoding_test.go @@ -164,6 +164,28 @@ func (s *encodingSuite) TestStructPtr() { s.Equal(sv, *(v.(*structValue))) } +/* slice */ + +type sliceModel struct { + Value []byte + ValuePtr *[]byte +} + +func (s *encodingSuite) TestSlice() { + c, _ := s.encodeValue(sliceModel{ + Value: []byte("123"), + }) + v, _ := s.decodeValue(sliceModel{}, c) + s.Equal([]byte("123"), v) +} + +func (s *encodingSuite) TestSlicePtr() { + sv := []byte("123") + c, _ := s.encodeValuePtr(sliceModel{ValuePtr: &sv}) + v, _ := s.decodeValuePtr(sliceModel{}, c) + s.Equal(sv, *(v.(*[]byte))) +} + /* multiple */ type multipleModel struct { diff --git a/internal/util/reflect.go b/internal/util/reflect.go index 2da0224..0b9660b 100644 --- a/internal/util/reflect.go +++ b/internal/util/reflect.go @@ -4,13 +4,13 @@ import ( "reflect" ) -// ReflectValue returns reflect value underlying given value, unwrapping pointer and slice +// ReflectValue returns reflect value underlying given value, unwrapping pointer func ReflectValue(v interface{}) reflect.Value { rv, ok := v.(reflect.Value) if !ok { rv = reflect.ValueOf(v) } - for rv.Kind() == reflect.Ptr || rv.Kind() == reflect.Slice { + for rv.Kind() == reflect.Ptr { rv = rv.Elem() } return rv