Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. /* Using reflect.MakeFunc to fetch from map[string]interface{}.
  2. * getString(key) will either return the 'string' value or empty string.
  3. * getInt(key) will either return the 'int' value or a 0.
  4. */
  5.  
  6. package main
  7.  
  8. import (
  9. "fmt"
  10. "reflect"
  11. )
  12.  
  13. var record map[string]interface{}
  14.  
  15. func init() {
  16. record = map[string]interface{}{
  17. "name": "urx",
  18. "number": 168,
  19. }
  20. }
  21.  
  22. func get(in []reflect.Value, retType reflect.Type) ([]reflect.Value) {
  23. m := in[0]
  24. key := in[1]
  25. result := m.MapIndex(key)
  26. ok := false
  27.  
  28. if result.IsValid() == false {
  29. return []reflect.Value{reflect.Zero(retType), reflect.ValueOf(ok)}
  30. }
  31.  
  32. resultval := result.Interface()
  33.  
  34. if retType != reflect.TypeOf(resultval) {
  35. return []reflect.Value{reflect.Zero(retType), reflect.ValueOf(ok)}
  36. }
  37.  
  38. ok = true
  39. return []reflect.Value{reflect.ValueOf(resultval), reflect.ValueOf(ok)}
  40. }
  41.  
  42. func MakeFuncStub(typ reflect.Type, fn func(args []reflect.Value, retType reflect.Type) (results []reflect.Value)) reflect.Value {
  43. retType := typ.Out(0)
  44. return reflect.MakeFunc(typ, func(args []reflect.Value) (results []reflect.Value) {
  45. return fn(args, retType)
  46. })
  47. }
  48.  
  49. func main() {
  50.  
  51. makeGet := func(fptr interface{}) {
  52. fn := reflect.ValueOf(fptr).Elem()
  53. fn.Set(MakeFuncStub(fn.Type(), get))
  54. }
  55.  
  56. var getInt func(map[string]interface{}, string) (int, bool)
  57. makeGet(&getInt)
  58.  
  59. var getString func(map[string]interface{}, string) (string, bool)
  60. makeGet(&getString)
  61.  
  62. v1, ok := getInt(record, "number")
  63. fmt.Printf("%v, %v\n", v1, ok)
  64.  
  65. v2, ok := getString(record, "doesnotexist")
  66. fmt.Printf("%v, %v\n", v2, ok)
  67.  
  68. v3, ok := getString(record, "number")
  69. fmt.Printf("%v, %v\n", v3, ok)
  70.  
  71. v4, ok := getString(record, "name")
  72. fmt.Printf("%v, %v\n", v4, ok)
  73.  
  74. v5, ok := getInt(record, "nonum")
  75. fmt.Printf("%v, %v\n", v5, ok)
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement