Blame view

go/src/themaru/vendor/github.com/modern-go/reflect2/README.md 2.46 KB
476d2547e   김태훈   태마루 시스템 설정 / 업데이트...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  # reflect2
  
  [![Sourcegraph](https://sourcegraph.com/github.com/modern-go/reflect2/-/badge.svg)](https://sourcegraph.com/github.com/modern-go/reflect2?badge)
  [![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/modern-go/reflect2)
  [![Build Status](https://travis-ci.org/modern-go/reflect2.svg?branch=master)](https://travis-ci.org/modern-go/reflect2)
  [![codecov](https://codecov.io/gh/modern-go/reflect2/branch/master/graph/badge.svg)](https://codecov.io/gh/modern-go/reflect2)
  [![rcard](https://goreportcard.com/badge/github.com/modern-go/reflect2)](https://goreportcard.com/report/github.com/modern-go/reflect2)
  [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](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).