add README
3 files changed
tree: cd15b1b076c257de688c5209cfeec9706738e868
  1. test15/
  2. tests/
  3. .gitignore
  4. .travis.yml
  5. go_above_17.go
  6. go_above_19.go
  7. go_below_17.go
  8. go_below_19.go
  9. Gopkg.lock
  10. Gopkg.toml
  11. LICENSE
  12. README.md
  13. reflect2.go
  14. reflect2_amd64.s
  15. reflect2_kind.go
  16. relfect2_386.s
  17. relfect2_amd64p32.s
  18. relfect2_arm.s
  19. relfect2_arm64.s
  20. relfect2_mips64x.s
  21. relfect2_mipsx.s
  22. relfect2_ppc64x.s
  23. relfect2_s390x.s
  24. safe_field.go
  25. safe_map.go
  26. safe_slice.go
  27. safe_struct.go
  28. safe_type.go
  29. test.sh
  30. type_map.go
  31. type_map_test.go
  32. unsafe_array.go
  33. unsafe_eface.go
  34. unsafe_field.go
  35. unsafe_iface.go
  36. unsafe_link.go
  37. unsafe_map.go
  38. unsafe_ptr.go
  39. unsafe_slice.go
  40. unsafe_struct.go
  41. unsafe_type.go
README.md

reflect2

Sourcegraph GoDoc Build Status codecov rcard 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 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

// 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{}

valType := reflect2.TypeOf(1)
i := 1
j := 10
valType.Set(&i, &j)
// i will be 10

reflect2 get/set unsafe.Pointer

valType := reflect2.TypeOf(1)
i := 1
j := 10
valType.UnsafeSet(unsfae.Pointer(&i), unsafe.Pointer(&j))
// i will be 10