Skip to content

Commit

Permalink
Merge pull request #2 from justinsb/lazy_init_type_discovery
Browse files Browse the repository at this point in the history
Lazy-init types & packages
  • Loading branch information
taowen authored Jul 18, 2018
2 parents 4b7aa43 + e4eb82f commit 94122c3
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions type_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"reflect"
"runtime"
"strings"
"sync"
"unsafe"
)

Expand All @@ -15,10 +16,17 @@ func typelinks1() [][]unsafe.Pointer
//go:linkname typelinks2 reflect.typelinks
func typelinks2() (sections []unsafe.Pointer, offset [][]int32)

var types = map[string]reflect.Type{}
var packages = map[string]map[string]reflect.Type{}
// initOnce guards initialization of types and packages
var initOnce sync.Once

var types map[string]reflect.Type
var packages map[string]map[string]reflect.Type

// discoverTypes initializes types and packages
func discoverTypes() {
types = make(map[string]reflect.Type)
packages = make(map[string]map[string]reflect.Type)

func init() {
ver := runtime.Version()
if ver == "go1.5" || strings.HasPrefix(ver, "go1.5.") {
loadGo15Types()
Expand Down Expand Up @@ -90,11 +98,13 @@ type emptyInterface struct {

// TypeByName return the type by its name, just like Class.forName in java
func TypeByName(typeName string) Type {
initOnce.Do(discoverTypes)
return Type2(types[typeName])
}

// TypeByPackageName return the type by its package and name
func TypeByPackageName(pkgPath string, name string) Type {
initOnce.Do(discoverTypes)
pkgTypes := packages[pkgPath]
if pkgTypes == nil {
return nil
Expand Down

0 comments on commit 94122c3

Please sign in to comment.