github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/net/values.go (about) 1 package net 2 3 import ( 4 "bytes" 5 "fmt" 6 "net/url" 7 "sort" 8 "strings" 9 ) 10 11 type val struct { 12 k string 13 v string 14 } 15 16 type Values struct { 17 u url.Values 18 s []val 19 } 20 21 func NewValues() *Values { 22 return &Values{ 23 u: make(map[string][]string), 24 s: make([]val, 0, 2), 25 } 26 } 27 28 // Get gets the first value associated with the given key. 29 // If there are no values associated with the key, Get returns 30 // the empty string. To access multiple values, use the map 31 // directly. 32 func (s *Values) Get(key string) string { 33 vs := s.u[key] 34 if len(vs) == 0 { 35 return "" 36 } 37 return vs[0] 38 } 39 40 // Set sets the key to value. It replaces any existing 41 // values. 42 func (s *Values) Set(key, value string) *Values { 43 s.u[key] = []string{value} 44 s.s = append(s.s, val{k: key, v: value}) 45 return s 46 } 47 48 //SetMap 指定map[string]interface{}并添加到values中 49 func (s *Values) SetMap(m map[string]interface{}) *Values { 50 for k, v := range m { 51 value := fmt.Sprint(v) 52 s.u[k] = []string{value} 53 s.s = append(s.s, val{k: k, v: value}) 54 } 55 return s 56 } 57 58 //SetSMap 指定map[string]string并添加到values中 59 func (s *Values) SetSMap(m map[string]string) *Values { 60 for k, value := range m { 61 s.u[k] = []string{value} 62 s.s = append(s.s, val{k: k, v: value}) 63 } 64 return s 65 } 66 67 //Encode 参数编号返回编码后的字符串 68 func (s *Values) Encode() string { 69 return s.u.Encode() 70 } 71 72 //Remove 移除某个值 73 func (s *Values) Remove(ks ...string) { 74 for _, k := range ks { 75 delete(s.u, k) 76 for i, v := range s.s { 77 if v.k == k { 78 ns := s.s[:i] 79 ns = append(ns, s.s[i+1:]...) 80 s.s = ns 81 return 82 } 83 } 84 } 85 } 86 87 //Sort 对参数进行参数 88 func (s *Values) Sort() *Values { 89 sort.Slice(s.s, func(i, j int) bool { 90 return s.s[i].k < s.s[j].k 91 }) 92 return s 93 } 94 95 //JoinAll 对参数进行拼接 96 func (s *Values) JoinAll(a string, b string, e ...string) string { 97 buffer := bytes.NewBufferString("") 98 for _, v := range s.s { 99 buffer.WriteString(v.k) 100 buffer.WriteString(a) 101 buffer.WriteString(v.v) 102 } 103 if len(e) > 0 { 104 for i := 0; i < len(e)/2; i++ { 105 buffer.WriteString(e[i*2]) 106 buffer.WriteString(a) 107 buffer.WriteString(e[i*2+1]) 108 buffer.WriteString(b) 109 } 110 if len(e)%2 == 1 { 111 buffer.WriteString(e[len(e)-1]) 112 } 113 } 114 return strings.Trim(buffer.String(), b) 115 } 116 117 //Join 只拼接值不为空的参数 118 func (s *Values) Join(a string, b string, e ...string) string { 119 buffer := bytes.NewBufferString("") 120 for _, v := range s.s { 121 if v.v != "" { 122 buffer.WriteString(v.k) 123 buffer.WriteString(a) 124 buffer.WriteString(v.v) 125 buffer.WriteString(b) 126 } 127 } 128 if len(e) > 0 { 129 for i := 0; i < len(e)/2; i++ { 130 buffer.WriteString(e[i*2]) 131 buffer.WriteString(a) 132 buffer.WriteString(e[i*2+1]) 133 buffer.WriteString(b) 134 } 135 if len(e)%2 == 1 { 136 buffer.WriteString(e[len(e)-1]) 137 } 138 } 139 return strings.Trim(buffer.String(), b) 140 }