https://github.com/gotidy/copy
Package for fast copying structs of different types
https://github.com/gotidy/copy
copy deepcopy go golang golang-library golang-package performance
Last synced: about 2 months ago
JSON representation
Package for fast copying structs of different types
- Host: GitHub
- URL: https://github.com/gotidy/copy
- Owner: gotidy
- License: apache-2.0
- Created: 2020-10-09T06:59:08.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2020-12-28T08:02:43.000Z (over 4 years ago)
- Last Synced: 2024-07-31T20:53:32.307Z (9 months ago)
- Topics: copy, deepcopy, go, golang, golang-library, golang-package, performance
- Language: Go
- Homepage:
- Size: 211 KB
- Stars: 47
- Watchers: 3
- Forks: 4
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-go - copy - Package for fast copying structs of different types. (Utilities / Utility/Miscellaneous)
- awesome-go-extra - copy - 10-09T06:59:08Z|2020-12-28T08:02:43Z| (Utilities / Fail injection)
README
# Package for fast copying structs of different types
[][godev] [][goreport] [](https://github.com/avelino/awesome-go)
[godev]: https://pkg.go.dev/github.com/gotidy/copy
[goreport]: https://goreportcard.com/report/github.com/gotidy/copyThis 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
```sh
go get -u github.com/gotidy/copy
```## Example
```go
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
- [ulule/Deepcopier](https://github.com/ulule/deepcopier)
- [jinzhu/Copier](https://github.com/jinzhu/copier)### [Benchmark](https://github.com/gotidy/copy-bench)
Benchmarks source code can be found [here](https://github.com/gotidy/copy-bench)
```sh
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][godev] for more information.
## License
[Apache 2.0](https://github.com/gotidy/copy/blob/master/LICENSE)