mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 18:13:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# 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). |