copy icon indicating copy to clipboard operation
copy copied to clipboard

Package for fast copying structs of different types

Package for fast copying structs of different types

GoDev Go Report Card Mentioned in Awesome Go

This package is meant to make copying of structs to/from others structs a bit easier.

Nested structures, embedded types, pointers, sql null types are supported.

Installation

go get -u github.com/gotidy/copy

Example

type Person struct {
    Name       string
    MiddleName *string
    Surname    string
}

type User struct {
    Person
    Email   string
    Age     int8
    Married bool
}

type Employee struct {
    Name       string
    MiddleName string
    Surname    string
    Email      string
    Age        int
}

src := User{
    Person: Person{
        Name:       "John",
        MiddleName: nil,
        Surname:    "Smith",
    },
    Email:   "[email protected]",
    Age:     33,
    Married: false,
}
dst := Employee{}

copiers := copy.New() // New("json")
copiers.Copy(&dst, &src)

// Or more fast use case is to create the type specific copier.

copier := copiers.Get(&Employee{}, &User{}) // Created once for a pair of types.
copier.Copy(&dst, &src)

Alternative projects

Benchmark

Benchmarks source code can be found here

go test -bench=. -benchmem ./...
goos: darwin
goarch: amd64
pkg: github.com/gotidy/copy-bench
BenchmarkManualCopy-12         177310519         6.92 ns/op          0 B/op        0 allocs/op
BenchmarkCopiers-12             13476417         84.1 ns/op          0 B/op        0 allocs/op
BenchmarkCopier-12              40226689         27.5 ns/op          0 B/op        0 allocs/op
BenchmarkJinzhuCopier-12          407480         2711 ns/op       2480 B/op       34 allocs/op
BenchmarkDeepcopier-12            262836         4346 ns/op       4032 B/op       73 allocs/op
PASS
ok      github.com/gotidy/copy-bench    6.922s

See the documentation for more information.

License

Apache 2.0