From e43a9c95f49398e02dae18ae18e76a0c7f38a38a Mon Sep 17 00:00:00 2001 From: smirnoffkin Date: Fri, 25 Aug 2023 16:28:27 +0300 Subject: [PATCH 1/3] Added Equals func for comparing two Nested objects and unit-tests for it --- nested.go | 60 +++++ nested_test.go | 580 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 640 insertions(+) diff --git a/nested.go b/nested.go index 10560a4..8e19517 100644 --- a/nested.go +++ b/nested.go @@ -50,6 +50,7 @@ import ( "bytes" "encoding/json" "fmt" + "reflect" "strconv" "strings" @@ -950,3 +951,62 @@ func (j *Nested) ToObject() any { return result } + +// Функция для сравнения двух объектов Nested. +// +// Возвращает true, если объекты равны, в противном случае false. +// При сравнении учитываются не только сами значения, но и типы данных объекта. +// Также, если элементы содержатся в массиве, важен порядок их расположения, то есть в соответствующих индексах массива должны быть равные элементы. +// +// Пример: +// +// var a Nested = Nested{isValue: true, value: int(5)}. +// var b Nested = Nested{isValue: true, value: uint64(5)}. +// Equals(&a, &b) вернет false, так как переменные имеют разный тип данных. +// +// var a Nested = Nested{ +// isArray: true, +// array: []*Nested{ +// { +// nested: map[string]*Nested{ +// "nested_value": { +// isValue: true, +// value: "string in nested array", +// }, +// }, +// }, +// { +// nested: map[string]*Nested{ +// "super value": { +// isValue: true, +// value: "string in nested array", +// }, +// }, +// }, +// }, +// } +// var b Nested = Nested{ +// isArray: true, +// array: []*Nested{ +// { +// nested: map[string]*Nested{ +// "super value": { +// isValue: true, +// value: "string in nested array", +// }, +// }, +// }, +// { +// nested: map[string]*Nested{ +// "nested_value": { +// isValue: true, +// value: "string in nested array", +// }, +// }, +// }, +// }, +// } +// Equals(&a, &b) вернет false, так как важен порядок элементов в массиве. +func Equals(a, b *Nested) bool { + return reflect.DeepEqual(a.ToObject(), b.ToObject()) +} diff --git a/nested_test.go b/nested_test.go index 3257bf4..0404ff7 100644 --- a/nested_test.go +++ b/nested_test.go @@ -1779,3 +1779,583 @@ func Test_ToJSONString(t *testing.T) { nested.ToJSONString(), ) } + +func Test_Equals(t *testing.T) { + tests := []struct { + a Nested + b Nested + expected bool + }{ + { + a: Nested{ + isArray: false, + isValue: true, + value: 5, + }, + b: Nested{ + isValue: true, + value: 5, + }, + expected: true, + }, + { + a: Nested{ + isArray: false, + isValue: true, + value: int(7), + }, + b: Nested{ + isArray: false, + isValue: true, + value: uint64(7), + }, + expected: false, + }, + { + a: Nested{ + isArray: false, + isValue: true, + value: float32(110.137), + }, + b: Nested{ + isArray: false, + isValue: true, + value: float64(110.137), + }, + expected: false, + }, + { + a: Nested{ + isValue: true, + value: map[string]interface{}{ + "key": "value", + "some_nested": "some value", + }, + }, + b: Nested{ + isValue: true, + value: map[string]interface{}{ + "key": "value", + "some_nested": "some value", + }, + }, + expected: true, + }, + { + a: Nested{ + isValue: true, + value: map[string]interface{}{ + "key": "value", + "some_nested": "some value", + }, + }, + b: Nested{ + isValue: true, + value: map[string][]string{ + "nested_array": {"elem1", "elem2"}, + }, + }, + expected: false, + }, + { + a: Nested{ + isArray: true, + array: []*Nested{ + { + nested: map[string]*Nested{ + "nested_value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + { + nested: map[string]*Nested{ + "super value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + }, + }, + b: Nested{ + isArray: true, + array: []*Nested{ + { + nested: map[string]*Nested{ + "nested_value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + { + nested: map[string]*Nested{ + "super value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + }, + }, + expected: true, + }, + { + a: Nested{ + isArray: true, + array: []*Nested{ + { + nested: map[string]*Nested{ + "nested_value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + { + nested: map[string]*Nested{ + "super value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + }, + }, + b: Nested{ + isArray: true, + array: []*Nested{ + { + nested: map[string]*Nested{ + "super value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + { + nested: map[string]*Nested{ + "nested_value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + }, + }, + expected: false, + }, + { + a: Nested{ + nested: map[string]*Nested{ + "value": { + isValue: true, + value: "string in new nested", + }, + "nested": { + nested: map[string]*Nested{ + "value": { + isValue: true, + value: 1042, + }, + }, + }, + }, + }, + b: Nested{ + nested: map[string]*Nested{ + "value": { + isValue: true, + value: "string in new nested", + }, + "nested": { + nested: map[string]*Nested{ + "value": { + isValue: true, + value: 1042, + }, + }, + }, + }, + }, + expected: true, + }, + { + a: Nested{ + nested: map[string]*Nested{ + "value": { + isValue: true, + value: "string in new nested", + }, + "nested": { + nested: map[string]*Nested{ + "value": { + isValue: true, + value: 1042, + }, + }, + }, + }, + }, + b: Nested{ + isArray: true, + isValue: true, + value: "Some value", + array: []*Nested{ + { + nested: map[string]*Nested{ + "value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + }, + nested: map[string]*Nested{ + "value": { + isValue: true, + value: "string in new nested", + }, + "nested": { + nested: map[string]*Nested{ + "value": { + isValue: true, + value: 1042, + }, + }, + }, + }, + }, + expected: false, + }, + { + a: Nested{ + isValue: true, + value: map[string]interface{}{ + "key1": 50, + }, + nested: map[string]*Nested{ + "value": { + isValue: true, + value: "string in new nested", + }, + "nested": { + nested: map[string]*Nested{ + "value": { + isValue: true, + value: 1042, + }, + }, + }, + }, + }, + b: Nested{ + isValue: true, + value: map[string]interface{}{ + "key1": 50, + "key2": map[string]string{ + "innne_key1": "inner_value1", + }, + "key3": complex(10, 15), + }, + nested: map[string]*Nested{ + "value": { + isValue: true, + value: "string in new nested", + }, + "nested": { + nested: map[string]*Nested{ + "value": { + isValue: true, + value: 1042, + }, + }, + }, + }, + }, + expected: false, + }, + { + a: Nested{ + nested: map[string]*Nested{ + "number": { + isValue: true, + value: 1.5, + }, + "str": { + isValue: true, + value: "string", + }, + "array": { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 3, + }, + { + isValue: true, + value: "string3", + }, + { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 4, + }, + { + isValue: true, + value: 5, + }, + }, + }, + { + nested: map[string]*Nested{ + "number": { + isValue: true, + value: 6, + }, + }, + }, + }, + }, + "nested": { + nested: map[string]*Nested{ + "str": { + isValue: true, + value: "string2", + }, + "number": { + isValue: true, + value: 2, + }, + "array": { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 7, + }, + }, + }, + }, + }, + }, + }, + b: Nested{ + nested: map[string]*Nested{ + "number": { + isValue: true, + value: 1.5, + }, + "str": { + isValue: true, + value: "string", + }, + "array": { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 3, + }, + { + isValue: true, + value: "string3", + }, + { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 4, + }, + { + isValue: true, + value: 5, + }, + }, + }, + { + nested: map[string]*Nested{ + "number": { + isValue: true, + value: 6, + }, + }, + }, + }, + }, + "nested": { + nested: map[string]*Nested{ + "str": { + isValue: true, + value: "string2", + }, + "number": { + isValue: true, + value: 2, + }, + "array": { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 7, + }, + }, + }, + }, + }, + }, + }, + expected: true, + }, + { + a: Nested{ + nested: map[string]*Nested{ + "number": { + isValue: true, + value: 1.5, + }, + "str": { + isValue: true, + value: "string", + }, + "array": { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 3, + }, + { + isValue: true, + value: "string3", + }, + { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 4, + }, + { + isValue: true, + value: 5, + }, + }, + }, + { + nested: map[string]*Nested{ + "number": { + isValue: true, + value: 6, + }, + }, + }, + }, + }, + "nested": { + nested: map[string]*Nested{ + "str": { + isValue: true, + value: "string2", + }, + "number": { + isValue: true, + value: 2, + }, + "array": { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 7, + }, + }, + }, + }, + }, + }, + }, + b: Nested{ + nested: map[string]*Nested{ + "number": { + isValue: true, + value: 1.5, + }, + "str": { + isValue: true, + value: "string", + }, + "array": { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 3, + }, + { + isValue: true, + value: "string3", + }, + { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 4, + }, + { + isValue: true, + value: 5, + }, + }, + }, + { + nested: map[string]*Nested{ + "number": { + isValue: true, + value: 6, + }, + }, + }, + }, + }, + "nested": { + isValue: true, + value: "DIFFERENT NESTED", + nested: map[string]*Nested{ + "str": { + isValue: true, + value: "string2", + }, + "number": { + isValue: true, + value: 2, + }, + "array": { + isArray: true, + array: []*Nested{ + { + isValue: true, + value: 7, + }, + }, + }, + }, + }, + }, + }, + expected: false, + }, + } + + for _, test := range tests { + assert.Equal(t, test.expected, Equals(&test.a, &test.b)) + } +} From 3ebf9c8b30da43ceac4319ebeaa8856a280c0ab7 Mon Sep 17 00:00:00 2001 From: smirnoffkin Date: Fri, 25 Aug 2023 16:33:21 +0300 Subject: [PATCH 2/3] Update readme --- README.md | 206 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 147 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 62143bb..57eb13c 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ for _, elem := range array { } ``` -Eсть возможность инициализации структуры из JSON\-строки и обратно с помощью \[FromJSONString\] и \[ToJSONString\]: +Eсть возможность инициализации структуры из JSON\-строки и обратно с помощью [FromJSONString](<#FromJSONString>) и \[ToJSONString\]: ``` nested := FromJSONString(`{"nested_object": {"key1": "value1", "key2": "value2"}, "nested_array": ["elem1", "elem2"]}`) @@ -54,39 +54,104 @@ for _, elem := range array { nested.ToJSONString() // {"nested_object": {"key1": "value1", "key2": "value2"}, "nested_array": ["elem1", "elem2"]} ``` -Для инициализации структуры словарем, массивом или значением\-интерфейсом и обратной конвертации в интерфейс см. \[FromObject\] и \[ToObject\]. +Для инициализации структуры словарем, массивом или значением\-интерфейсом и обратной конвертации в интерфейс см. [FromObject](<#FromObject>) и \[ToObject\]. ## Index -- [type Nested](<#type-nested>) - - [func FromJSONString(nested string) *Nested](<#func-fromjsonstring>) - - [func FromObject(obj any) *Nested](<#func-fromobject>) - - [func (j *Nested) ArrayAdd(element *Nested, keys ...string) error](<#func-nested-arrayadd>) - - [func (j *Nested) ArrayAddArray(element []*Nested, keys ...string) error](<#func-nested-arrayaddarray>) - - [func (j *Nested) ArrayAddValue(element any, keys ...string) error](<#func-nested-arrayaddvalue>) - - [func (j *Nested) ArrayDelete(f func(element *Nested) bool, keys ...string) error](<#func-nested-arraydelete>) - - [func (j *Nested) ArrayFindAll(f func(*Nested) bool, keys ...string) ([]*Nested, error)](<#func-nested-arrayfindall>) - - [func (j *Nested) ArrayFindOne(f func(element *Nested) bool, keys ...string) (*Nested, error)](<#func-nested-arrayfindone>) - - [func (j *Nested) Clear() error](<#func-nested-clear>) - - [func (j *Nested) Delete(keys ...string) error](<#func-nested-delete>) - - [func (j *Nested) Get(keys ...string) (*Nested, error)](<#func-nested-get>) - - [func (j *Nested) GetArray(keys ...string) ([]*Nested, error)](<#func-nested-getarray>) - - [func (j *Nested) GetMap(keys ...string) (map[string]*Nested, error)](<#func-nested-getmap>) - - [func (j *Nested) GetValue(keys ...string) (any, error)](<#func-nested-getvalue>) - - [func (j *Nested) IsArray() bool](<#func-nested-isarray>) - - [func (j *Nested) IsEmpty() bool](<#func-nested-isempty>) - - [func (j *Nested) IsNested() bool](<#func-nested-isnested>) - - [func (j *Nested) IsValue() bool](<#func-nested-isvalue>) - - [func (j *Nested) Length() int](<#func-nested-length>) - - [func (j *Nested) Set(nested *Nested, keys ...string) error](<#func-nested-set>) - - [func (j *Nested) SetArray(array []*Nested, keys ...string) error](<#func-nested-setarray>) - - [func (j *Nested) SetMap(nested map[string]*Nested, keys ...string) error](<#func-nested-setmap>) - - [func (j *Nested) SetValue(value any, keys ...string) error](<#func-nested-setvalue>) - - [func (j *Nested) ToJSONString() string](<#func-nested-tojsonstring>) - - [func (j *Nested) ToObject() any](<#func-nested-toobject>) - - -## type [Nested]() +- [func Equals\(a, b \*Nested\) bool](<#Equals>) +- [type Nested](<#Nested>) + - [func FromJSONString\(nested string\) \*Nested](<#FromJSONString>) + - [func FromObject\(obj any\) \*Nested](<#FromObject>) + - [func \(j \*Nested\) ArrayAdd\(element \*Nested, keys ...string\) error](<#Nested.ArrayAdd>) + - [func \(j \*Nested\) ArrayAddArray\(element \[\]\*Nested, keys ...string\) error](<#Nested.ArrayAddArray>) + - [func \(j \*Nested\) ArrayAddValue\(element any, keys ...string\) error](<#Nested.ArrayAddValue>) + - [func \(j \*Nested\) ArrayDelete\(f func\(element \*Nested\) bool, keys ...string\) error](<#Nested.ArrayDelete>) + - [func \(j \*Nested\) ArrayFindAll\(f func\(\*Nested\) bool, keys ...string\) \(\[\]\*Nested, error\)](<#Nested.ArrayFindAll>) + - [func \(j \*Nested\) ArrayFindOne\(f func\(element \*Nested\) bool, keys ...string\) \(\*Nested, error\)](<#Nested.ArrayFindOne>) + - [func \(j \*Nested\) Clear\(\) error](<#Nested.Clear>) + - [func \(j \*Nested\) Delete\(keys ...string\) error](<#Nested.Delete>) + - [func \(j \*Nested\) Get\(keys ...string\) \(\*Nested, error\)](<#Nested.Get>) + - [func \(j \*Nested\) GetArray\(keys ...string\) \(\[\]\*Nested, error\)](<#Nested.GetArray>) + - [func \(j \*Nested\) GetMap\(keys ...string\) \(map\[string\]\*Nested, error\)](<#Nested.GetMap>) + - [func \(j \*Nested\) GetValue\(keys ...string\) \(any, error\)](<#Nested.GetValue>) + - [func \(j \*Nested\) IsArray\(\) bool](<#Nested.IsArray>) + - [func \(j \*Nested\) IsEmpty\(\) bool](<#Nested.IsEmpty>) + - [func \(j \*Nested\) IsNested\(\) bool](<#Nested.IsNested>) + - [func \(j \*Nested\) IsValue\(\) bool](<#Nested.IsValue>) + - [func \(j \*Nested\) Length\(\) int](<#Nested.Length>) + - [func \(j \*Nested\) Set\(nested \*Nested, keys ...string\) error](<#Nested.Set>) + - [func \(j \*Nested\) SetArray\(array \[\]\*Nested, keys ...string\) error](<#Nested.SetArray>) + - [func \(j \*Nested\) SetMap\(nested map\[string\]\*Nested, keys ...string\) error](<#Nested.SetMap>) + - [func \(j \*Nested\) SetValue\(value any, keys ...string\) error](<#Nested.SetValue>) + - [func \(j \*Nested\) ToJSONString\(\) string](<#Nested.ToJSONString>) + - [func \(j \*Nested\) ToObject\(\) any](<#Nested.ToObject>) + + + +## func [Equals]() + +```go +func Equals(a, b *Nested) bool +``` + +Функция для сравнения двух объектов Nested. + +Возвращает true, если объекты равны, в противном случае false. При сравнении учитываются не только сами значения, но и типы данных объекта. Также, если элементы содержатся в массиве, важен порядок их расположения, то есть в соответствующих индексах массива должны быть равные элементы. + +Пример: + +``` +var a Nested = Nested{isValue: true, value: int(5)}. +var b Nested = Nested{isValue: true, value: uint64(5)}. +Equals(&a, &b) вернет false, так как переменные имеют разный тип данных. + +var a Nested = Nested{ + isArray: true, + array: []*Nested{ + { + nested: map[string]*Nested{ + "nested_value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + { + nested: map[string]*Nested{ + "super value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + }, +} +var b Nested = Nested{ + isArray: true, + array: []*Nested{ + { + nested: map[string]*Nested{ + "super value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + { + nested: map[string]*Nested{ + "nested_value": { + isValue: true, + value: "string in nested array", + }, + }, + }, + }, +} +Equals(&a, &b) вернет false, так как важен порядок элементов в массиве. +``` + + +## type [Nested]() Структура для описания объекта. @@ -108,7 +173,8 @@ type Nested struct { } ``` -### func [FromJSONString]() + +### func [FromJSONString]() ```go func FromJSONString(nested string) *Nested @@ -129,7 +195,8 @@ FromJSONString("42").GetValue() // 42 FromJSONString("true").GetValue() // true ``` -### func [FromObject]() + +### func [FromObject]() ```go func FromObject(obj any) *Nested @@ -139,7 +206,7 @@ func FromObject(obj any) *Nested Вложенные словари могут быть вида map\[string\]any. Если ключи словаря имеют другой тип, словарь сохранится как объект\-значение. -Если объект не является массивом \[\]any или словарем map\[string\]any, он сохраняется как исходный тип интерфейса в объект\-значение, кроме float64. Для него производится попытка конвертации в int. Это связано с тем, что функция используется в \[FromJSONString\], где в свою очередь для парсинга строки с объектом или массивом используется Unmarshal из пакета \[ https://pkg.go.dev/encoding/json \], в котором все числа парсятся как float64. +Если объект не является массивом \[\]any или словарем map\[string\]any, он сохраняется как исходный тип интерфейса в объект\-значение, кроме float64. Для него производится попытка конвертации в int. Это связано с тем, что функция используется в [FromJSONString](<#FromJSONString>), где в свою очередь для парсинга строки с объектом или массивом используется Unmarshal из пакета \[ https://pkg.go.dev/encoding/json \], в котором все числа парсятся как float64. Примеры: @@ -155,7 +222,8 @@ nested = FromObject(42) nested.IsValue() // true ``` -### func \(\*Nested\) [ArrayAdd]() + +### func \(\*Nested\) [ArrayAdd]() ```go func (j *Nested) ArrayAdd(element *Nested, keys ...string) error @@ -167,7 +235,8 @@ func (j *Nested) ArrayAdd(element *Nested, keys ...string) error Если один из вложенных объектов в цепочке является массивом или значением, функция вернет ошибку. Последний объект в цепочке должен быть массивом. Исходный объект может являться массивом, если не передана цепочка ключей. -### func \(\*Nested\) [ArrayAddArray]() + +### func \(\*Nested\) [ArrayAddArray]() ```go func (j *Nested) ArrayAddArray(element []*Nested, keys ...string) error @@ -179,7 +248,8 @@ func (j *Nested) ArrayAddArray(element []*Nested, keys ...string) error Если один из вложенных объектов в цепочке является массивом или значением, функция вернет ошибку. Последний объект в цепочке должен быть массивом. Исходный объект может являться массивом, если не передана цепочка ключей. -### func \(\*Nested\) [ArrayAddValue]() + +### func \(\*Nested\) [ArrayAddValue]() ```go func (j *Nested) ArrayAddValue(element any, keys ...string) error @@ -191,7 +261,8 @@ func (j *Nested) ArrayAddValue(element any, keys ...string) error Если один из вложенных объектов в цепочке является массивом или значением, функция вернет ошибку. Последний объект в цепочке должен быть массивом. Исходный объект может являться массивом, если не передана цепочка ключей. -### func \(\*Nested\) [ArrayDelete]() + +### func \(\*Nested\) [ArrayDelete]() ```go func (j *Nested) ArrayDelete(f func(element *Nested) bool, keys ...string) error @@ -223,7 +294,8 @@ nested.ArrayDelete( nested.GetArray() // []*Nested{{}}, nil ``` -### func \(\*Nested\) [ArrayFindAll]() + +### func \(\*Nested\) [ArrayFindAll]() ```go func (j *Nested) ArrayFindAll(f func(*Nested) bool, keys ...string) ([]*Nested, error) @@ -302,7 +374,8 @@ array, _ := nested.ArrayFindOne( array[0].GetValue() // 142, nil ``` -### func \(\*Nested\) [ArrayFindOne]() + +### func \(\*Nested\) [ArrayFindOne]() ```go func (j *Nested) ArrayFindOne(f func(element *Nested) bool, keys ...string) (*Nested, error) @@ -380,7 +453,8 @@ value, _ := nested.ArrayFindOne( value.GetValue() // 42, nil ``` -### func \(\*Nested\) [Clear]() + +### func \(\*Nested\) [Clear]() ```go func (j *Nested) Clear() error @@ -390,7 +464,8 @@ func (j *Nested) Clear() error Следует учитывать, что внутри структуры используются указатели. Если структура была инициализирована указателями на внешние объекты, они тоже могут стать недоступны. -### func \(\*Nested\) [Delete]() + +### func \(\*Nested\) [Delete]() ```go func (j *Nested) Delete(keys ...string) error @@ -404,7 +479,8 @@ func (j *Nested) Delete(keys ...string) error Если последний ключ в цепочке отсутствует, функция завершится без ошибок. -### func \(\*Nested\) [Get]() + +### func \(\*Nested\) [Get]() ```go func (j *Nested) Get(keys ...string) (*Nested, error) @@ -418,7 +494,8 @@ func (j *Nested) Get(keys ...string) (*Nested, error) Функцию также следует использовать для проверки наличия ключа в объекте через сравнение с nil возвращенного указателя или ошибки. -### func \(\*Nested\) [GetArray]() + +### func \(\*Nested\) [GetArray]() ```go func (j *Nested) GetArray(keys ...string) ([]*Nested, error) @@ -428,7 +505,8 @@ func (j *Nested) GetArray(keys ...string) ([]*Nested, error) Все вложенные объекты до последнего в цепочке должны быть вида ключ\-значение. Последний \- массивом. Можно не передавать ключи, тогда исходный объект должен быть массивом. -### func \(\*Nested\) [GetMap]() + +### func \(\*Nested\) [GetMap]() ```go func (j *Nested) GetMap(keys ...string) (map[string]*Nested, error) @@ -440,7 +518,8 @@ func (j *Nested) GetMap(keys ...string) (map[string]*Nested, error) Если один из объектов в цепочке является массивом или значением, функция вернет ошибку. -### func \(\*Nested\) [GetValue]() + +### func \(\*Nested\) [GetValue]() ```go func (j *Nested) GetValue(keys ...string) (any, error) @@ -450,7 +529,8 @@ func (j *Nested) GetValue(keys ...string) (any, error) Все вложенные объекты до последнего в цепочке должны быть вида ключ\-значение. Последний \- скалярным значением. Можно не передавать ключи, тогда исходный объект должен быть значением. -### func \(\*Nested\) [IsArray]() + +### func \(\*Nested\) [IsArray]() ```go func (j *Nested) IsArray() bool @@ -458,7 +538,8 @@ func (j *Nested) IsArray() bool Проверка, является ли объект массивом. -### func \(\*Nested\) [IsEmpty]() + +### func \(\*Nested\) [IsEmpty]() ```go func (j *Nested) IsEmpty() bool @@ -466,7 +547,8 @@ func (j *Nested) IsEmpty() bool Проверка, что объект пустой и имеет вид ключ\-значение. -### func \(\*Nested\) [IsNested]() + +### func \(\*Nested\) [IsNested]() ```go func (j *Nested) IsNested() bool @@ -474,7 +556,8 @@ func (j *Nested) IsNested() bool Проверка, что объект имеет тип ключ\-значение. -### func \(\*Nested\) [IsValue]() + +### func \(\*Nested\) [IsValue]() ```go func (j *Nested) IsValue() bool @@ -482,7 +565,8 @@ func (j *Nested) IsValue() bool Проверка, является ли объект скалярным значением. -### func \(\*Nested\) [Length]() + +### func \(\*Nested\) [Length]() ```go func (j *Nested) Length() int @@ -492,7 +576,8 @@ func (j *Nested) Length() int Для массива \- количество элементов. Для объекта ключ\-значение \- количество ключей. Для скалярного значения \- \-1. -### func \(\*Nested\) [Set]() + +### func \(\*Nested\) [Set]() ```go func (j *Nested) Set(nested *Nested, keys ...string) error @@ -506,7 +591,8 @@ func (j *Nested) Set(nested *Nested, keys ...string) error Функция принимает указатель на сохраняемый объект. Если в дальнейшем изменится исходный объект, изменится и вложенный. -### func \(\*Nested\) [SetArray]() + +### func \(\*Nested\) [SetArray]() ```go func (j *Nested) SetArray(array []*Nested, keys ...string) error @@ -520,7 +606,8 @@ func (j *Nested) SetArray(array []*Nested, keys ...string) error Также можно не передавать цепочку ключей, если исходный объект является пустым \(IsEmpty\). В этом случае он станет объектом\-массивом. -### func \(\*Nested\) [SetMap]() + +### func \(\*Nested\) [SetMap]() ```go func (j *Nested) SetMap(nested map[string]*Nested, keys ...string) error @@ -536,7 +623,8 @@ func (j *Nested) SetMap(nested map[string]*Nested, keys ...string) error Если исходный объект непустой, удаление старых элементов не производится, и указатели на них останутся корректными. -### func \(\*Nested\) [SetValue]() + +### func \(\*Nested\) [SetValue]() ```go func (j *Nested) SetValue(value any, keys ...string) error @@ -550,7 +638,8 @@ func (j *Nested) SetValue(value any, keys ...string) error Также можно не передавать цепочку ключей, если исходный объект является пустым \(IsEmpty\). В этом случае он станет объектом\-значением. -### func \(\*Nested\) [ToJSONString]() + +### func \(\*Nested\) [ToJSONString]() ```go func (j *Nested) ToJSONString() string @@ -574,7 +663,8 @@ nested.ArrayAddValue("elem2", "nested_array") nested.ToJSONString() // {"nested_array":["elem1","elem2"],"nested_object":{"key1":"value1","key2":"value2"}} ``` -### func \(\*Nested\) [ToObject]() + +### func \(\*Nested\) [ToObject]() ```go func (j *Nested) ToObject() any @@ -603,6 +693,4 @@ nested.ArrayAddValue("elem2", "nested_array") nested.ToObject() ``` - - Generated by [gomarkdoc]() From 7fb7643b9bc448564e4fd8c22701b1963ab847d7 Mon Sep 17 00:00:00 2001 From: smirnoffkin Date: Fri, 25 Aug 2023 17:05:51 +0300 Subject: [PATCH 3/3] little fix in Equals-func description and update readme --- README.md | 4 ++-- nested.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 57eb13c..7c58341 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ func Equals(a, b *Nested) bool ``` var a Nested = Nested{isValue: true, value: int(5)}. var b Nested = Nested{isValue: true, value: uint64(5)}. -Equals(&a, &b) вернет false, так как переменные имеют разный тип данных. +// Equals(&a, &b) вернет false, так как переменные имеют разный тип данных. var a Nested = Nested{ isArray: true, @@ -147,7 +147,7 @@ var b Nested = Nested{ }, }, } -Equals(&a, &b) вернет false, так как важен порядок элементов в массиве. +// Equals(&a, &b) вернет false, так как важен порядок элементов в массиве. ``` diff --git a/nested.go b/nested.go index 8e19517..64f5886 100644 --- a/nested.go +++ b/nested.go @@ -962,7 +962,7 @@ func (j *Nested) ToObject() any { // // var a Nested = Nested{isValue: true, value: int(5)}. // var b Nested = Nested{isValue: true, value: uint64(5)}. -// Equals(&a, &b) вернет false, так как переменные имеют разный тип данных. +// // Equals(&a, &b) вернет false, так как переменные имеют разный тип данных. // // var a Nested = Nested{ // isArray: true, @@ -1006,7 +1006,7 @@ func (j *Nested) ToObject() any { // }, // }, // } -// Equals(&a, &b) вернет false, так как важен порядок элементов в массиве. +// // Equals(&a, &b) вернет false, так как важен порядок элементов в массиве. func Equals(a, b *Nested) bool { return reflect.DeepEqual(a.ToObject(), b.ToObject()) }