github.com/whatap/golib@v0.0.22/util/paramtext/ParamKV.go (about) 1 package paramtext 2 3 import ( 4 "bytes" 5 //"fmt" 6 "strings" 7 ) 8 9 /** 10 문자열 내부 key=value 조합의 value 값을 치환 11 12 separate : key=value(구분자:seperate)key=value 13 kvPipe : key(pipe)value 14 ToStringMap : k,v Map을 받아서 해당 key의 value를 모두 변경 15 ToStringStr : k,v string으로 하나의 키만 변환. 16 */ 17 18 type ParamKV struct { 19 separate string 20 kvPipe string 21 tokenList []string 22 kvMap map[string]string 23 origin string 24 } 25 26 func NewParamKV(plainText string) *ParamKV { 27 return NewParamKVSeperate(plainText, " ", "=") 28 } 29 30 func NewParamKVSeperate(plainText string, separate string, kvPipe string) *ParamKV { 31 p := new(ParamKV) 32 p.separate = separate 33 p.kvPipe = kvPipe 34 p.tokenList = strings.Split(plainText, separate) 35 p.kvMap = make(map[string]string) 36 p.origin = plainText 37 38 if p.tokenList != nil { 39 for _, kv := range p.tokenList { 40 k, v := ToPair(kv, p.kvPipe) 41 if k != "" { 42 p.kvMap[k] = v 43 } 44 } 45 } 46 return p 47 } 48 49 func (this *ParamKV) ToStringMap(p map[string]string) string { 50 // key 의 value 치환 51 for key, val := range p { 52 if this.ExistsKey(key) { 53 this.kvMap[key] = val 54 } 55 } 56 57 return this.ToString() 58 } 59 60 func (this *ParamKV) ToStringStr(k, v string) string { 61 62 if this.ExistsKey(k) { 63 this.kvMap[k] = v 64 } 65 66 return this.ToString() 67 } 68 69 func (this *ParamKV) ToString() string { 70 var buffer bytes.Buffer 71 72 if this.tokenList != nil { 73 kvLen := len(this.tokenList) 74 for i, kv := range this.tokenList { 75 k, _ := ToPair(kv, this.kvPipe) 76 if k != "" { 77 buffer.WriteString(k) 78 buffer.WriteString(this.kvPipe) 79 buffer.WriteString(this.kvMap[k]) 80 81 } else { 82 buffer.WriteString(kv) 83 } 84 85 if i < kvLen-1 { 86 buffer.WriteString(this.separate) 87 } 88 } 89 } 90 91 return buffer.String() 92 } 93 94 func (this *ParamKV) ExistsKey(key string) bool { 95 _, exists := this.kvMap[key] 96 return exists 97 } 98 99 func (this *ParamKV) GetKeys() []string { 100 keys := make([]string, len(this.kvMap)) 101 i := 0 102 for k := range this.kvMap { 103 keys[i] = k 104 i++ 105 } 106 return keys 107 } 108 109 func (this *ParamKV) GetValue(key string) string { 110 if this.ExistsKey(key) { 111 return this.kvMap[key] 112 } 113 return "" 114 } 115 116 func (this *ParamKV) GetOriginal() string { 117 return this.origin 118 } 119 120 // get k, v 121 func ToPair(s string, sep string) (k, v string) { 122 pos := 0 123 pos = strings.Index(strings.ToLower(s), strings.ToLower(sep)) 124 if pos != -1 { 125 k = s[0:pos] 126 v = s[pos+len(sep):] 127 } else { 128 k = "" 129 v = "" 130 } 131 132 return strings.TrimSpace(k), strings.TrimSpace(v) 133 }