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  }