github.com/searKing/golang/go@v1.2.117/net/resolver/register.go (about) 1 // Copyright 2021 The searKing Author. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package resolver 6 7 import ( 8 "sort" 9 "sync" 10 ) 11 12 var ( 13 resolversMu sync.RWMutex 14 resolvers = make(map[string]Builder) 15 // defaultScheme is the default scheme to use. 16 defaultScheme = "passthrough" 17 ) 18 19 // Register makes a database driver available by the provided name. 20 // If Register is called twice with the same name or if driver is nil, 21 // it panics. 22 func Register(driver Builder) { 23 resolversMu.Lock() 24 defer resolversMu.Unlock() 25 if driver == nil { 26 panic("resolver: Register driver is nil") 27 } 28 if _, dup := resolvers[driver.Scheme()]; dup { 29 panic("resolver: Register called twice for driver " + driver.Scheme()) 30 } 31 resolvers[driver.Scheme()] = driver 32 } 33 34 // Get returns the resolver builder registered with the given scheme. 35 // 36 // If no builder is register with the scheme, nil will be returned. 37 func Get(scheme string) Builder { 38 resolversMu.Lock() 39 defer resolversMu.Unlock() 40 if b, ok := resolvers[scheme]; ok { 41 return b 42 } 43 return nil 44 } 45 46 // SetDefaultScheme sets the default scheme that will be used. The default 47 // default scheme is "passthrough". 48 // 49 // NOTE: this function must only be called during initialization time (i.e. in 50 // an init() function), and is not thread-safe. The scheme set last overrides 51 // previously set values. 52 func SetDefaultScheme(scheme string) { 53 defaultScheme = scheme 54 } 55 56 // GetDefaultScheme gets the default scheme that will be used. 57 func GetDefaultScheme() string { 58 return defaultScheme 59 } 60 61 func unregisterAllDrivers() { 62 resolversMu.Lock() 63 defer resolversMu.Unlock() 64 // For tests. 65 resolvers = make(map[string]Builder) 66 } 67 68 // Resolvers returns a sorted list of the names of the registered resolvers. 69 func Resolvers() []string { 70 resolversMu.RLock() 71 defer resolversMu.RUnlock() 72 list := make([]string, 0, len(resolvers)) 73 for name := range resolvers { 74 list = append(list, name) 75 } 76 sort.Strings(list) 77 return list 78 }