No description
Find a file
2025-06-19 10:39:09 +03:00
go.mod first commit 2025-06-19 10:39:09 +03:00
go.sum first commit 2025-06-19 10:39:09 +03:00
LICENSE first commit 2025-06-19 10:39:09 +03:00
non_negative_integer.go first commit 2025-06-19 10:39:09 +03:00
non_negative_integer_test.go first commit 2025-06-19 10:39:09 +03:00
README.md first commit 2025-06-19 10:39:09 +03:00

Пакет go-nonnegativeinteger

Go Reference License: MIT

Пакет go-nonnegativeinteger предоставляет тип NonNegativeInteger для работы с неотрицательными целыми числами в Go с поддержкой сериализации/десериализации в JSON, XML и YAML.

Особенности

  • Тип NonNegativeInteger гарантирует неотрицательные значения (0 и положительные целые числа)
  • Поддержка сериализации в форматы:
    • JSON
    • XML
    • YAML
  • Полная валидация входных значений
  • Юнит-тесты с 100% покрытием функционала

Установка

go get git.ymnuktech.ru/ymnuk/go-nonnegativeinteger

Использование

Импорт пакета

import (
    "git.ymnuktech.ru/ymnuk/go-nonnegativeinteger"
    // или с псевдонимом
    nni "git.ymnuktech.ru/ymnuk/go-nonnegativeinteger"
)

Создание значения

// Создание с помощью конструктора (рекомендуется)
val, err := nonnegativeinteger.NewNonNegativeInteger(10)
if err != nil {
    // обработка ошибки (если значение отрицательное)
}

// Прямое создание (если уверены в значении)
var directVal nonnegativeinteger.NonNegativeInteger = 5

Работа с JSON

// Маршалинг
data, err := json.Marshal(val)

// Анмаршалинг
var newVal nonnegativeinteger.NonNegativeInteger
err := json.Unmarshal([]byte(`"15"`), &newVal)

Работа с XML

type Example struct {
    XMLName xml.Name `xml:"example"`
    Value   nonnegativeinteger.NonNegativeInteger `xml:"value"`
}

// Маршалинг
e := Example{Value: 7}
data, err := xml.Marshal(e)

// Анмаршалинг
var e Example
err := xml.Unmarshal([]byte(`<example><value>3</value></example>`), &e)

Работа с YAML

// Маршалинг
data, err := yaml.Marshal(val)

// Анмаршалинг
var newVal nonnegativeinteger.NonNegativeInteger
err := yaml.Unmarshal([]byte("8"), &newVal)

Примеры

Основное использование

package main

import (
    "encoding/json"
    "fmt"
    "log"
    
    "git.ymnuktech.ru/ymnuk/go-nonnegativeinteger"
)

func main() {
    // Создаем значение
    nni, err := nonnegativeinteger.NewNonNegativeInteger(42)
    if err != nil {
        log.Fatal(err)
    }
    
    // Маршалинг в JSON
    jsonData, _ := json.Marshal(nni)
    fmt.Println("JSON:", string(jsonData)) // JSON: 42
    
    // Анмаршалинг из JSON
    var newNni nonnegativeinteger.NonNegativeInteger
    if err := json.Unmarshal([]byte("10"), &newNni); err != nil {
        log.Fatal(err)
    }
    fmt.Println("Value:", newNni) // Value: 10
    
    // Попытка создать отрицательное значение
    _, err = nonnegativeinteger.NewNonNegativeInteger(-5)
    if err != nil {
        fmt.Println("Error:", err) // Error: value must be non-negative
    }
}

Использование в структурах

type User struct {
    ID      nonnegativeinteger.NonNegativeInteger `json:"id"`
    Name    string                               `json:"name"`
    Age     nonnegativeinteger.NonNegativeInteger `json:"age"`
}

func main() {
    user := User{
        ID:   1001,
        Name: "John Doe",
        Age:  30,
    }
    
    // Сериализация в JSON
    jsonData, _ := json.Marshal(user)
    fmt.Println(string(jsonData))
    // {"id":1001,"name":"John Doe","age":30}
    
    // Десериализация из JSON
    var newUser User
    jsonStr := `{"id":1002,"name":"Jane Smith","age":25}`
    if err := json.Unmarshal([]byte(jsonStr), &newUser); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("User: %+v", newUser)
    // User: {ID:1002 Name:Jane Smith Age:25}
}

Тестирование

Для запуска тестов:

go test -v

Тесты покрывают:

  • Создание значений (положительные, нулевые, отрицательные)
  • Сериализацию/десериализацию в JSON
  • Сериализацию/десериализацию в XML
  • Сериализацию/десериализацию в YAML
  • Обработку ошибок при недопустимых значениях
  • Граничные случаи

Зависимости

  • Стандартная библиотека Go
  • gopkg.in/yaml.v3 для работы с YAML

Лицензия

Этот проект лицензирован по лицензии MIT - см. файл LICENSE для деталей.