https://github.com/modern-go/reflect2
reflect api without runtime reflect.Value cost
https://github.com/modern-go/reflect2
go golang reflect reflection
Last synced: 20 days ago
JSON representation
reflect api without runtime reflect.Value cost
- Host: GitHub
- URL: https://github.com/modern-go/reflect2
- Owner: modern-go
- License: apache-2.0
- Created: 2018-02-28T06:25:52.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2025-03-22T23:23:37.000Z (about 1 month ago)
- Last Synced: 2025-04-10T00:03:15.202Z (25 days ago)
- Topics: go, golang, reflect, reflection
- Language: Go
- Size: 57.6 KB
- Stars: 786
- Watchers: 17
- Forks: 74
- Open Issues: 19
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- my-awesome - modern-go/reflect2 - 03 star:0.8k fork:0.1k reflect api without runtime reflect.Value cost (Go)
- go-awesome - **reflect2** - Reflect API with no runtime Reflect.Value cost (Open source library / Development Aid Package)
README
# reflect2
[](https://sourcegraph.com/github.com/modern-go/reflect2?badge)
[](http://godoc.org/github.com/modern-go/reflect2)
[](https://travis-ci.org/modern-go/reflect2)
[](https://codecov.io/gh/modern-go/reflect2)
[](https://goreportcard.com/report/github.com/modern-go/reflect2)
[](https://raw.githubusercontent.com/modern-go/reflect2/master/LICENSE)reflect api that avoids runtime reflect.Value cost
* reflect get/set interface{}, with type checking
* reflect get/set unsafe.Pointer, without type checking
* `reflect2.TypeByName` works like `Class.forName` found in java[json-iterator](https://github.com/json-iterator/go) use this package to save runtime dispatching cost.
This package is designed for low level libraries to optimize reflection performance.
General application should still use reflect standard library.# reflect2.TypeByName
```go
// given package is github.com/your/awesome-package
type MyStruct struct {
// ...
}// will return the type
reflect2.TypeByName("awesome-package.MyStruct")
// however, if the type has not been used
// it will be eliminated by compiler, so we can not get it in runtime
```# reflect2 get/set interface{}
```go
valType := reflect2.TypeOf(1)
i := 1
j := 10
valType.Set(&i, &j)
// i will be 10
```to get set `type`, always use its pointer `*type`
# reflect2 get/set unsafe.Pointer
```go
valType := reflect2.TypeOf(1)
i := 1
j := 10
valType.UnsafeSet(unsafe.Pointer(&i), unsafe.Pointer(&j))
// i will be 10
```to get set `type`, always use its pointer `*type`
# benchmark
Benchmark is not necessary for this package. It does nothing actually.
As it is just a thin wrapper to make go runtime public.
Both `reflect2` and `reflect` call same function
provided by `runtime` package exposed by go language.# unsafe safety
Instead of casting `[]byte` to `sliceHeader` in your application using unsafe.
We can use reflect2 instead. This way, if `sliceHeader` changes in the future,
only reflect2 need to be upgraded.reflect2 tries its best to keep the implementation same as reflect (by testing).