...

Source file src/github.com/josharian/intern/intern.go

Documentation: github.com/josharian/intern

     1  // Package intern interns strings.
     2  // Interning is best effort only.
     3  // Interned strings may be removed automatically
     4  // at any time without notification.
     5  // All functions may be called concurrently
     6  // with themselves and each other.
     7  package intern
     8  
     9  import "sync"
    10  
    11  var (
    12  	pool sync.Pool = sync.Pool{
    13  		New: func() interface{} {
    14  			return make(map[string]string)
    15  		},
    16  	}
    17  )
    18  
    19  // String returns s, interned.
    20  func String(s string) string {
    21  	m := pool.Get().(map[string]string)
    22  	c, ok := m[s]
    23  	if ok {
    24  		pool.Put(m)
    25  		return c
    26  	}
    27  	m[s] = s
    28  	pool.Put(m)
    29  	return s
    30  }
    31  
    32  // Bytes returns b converted to a string, interned.
    33  func Bytes(b []byte) string {
    34  	m := pool.Get().(map[string]string)
    35  	c, ok := m[string(b)]
    36  	if ok {
    37  		pool.Put(m)
    38  		return c
    39  	}
    40  	s := string(b)
    41  	m[s] = s
    42  	pool.Put(m)
    43  	return s
    44  }
    45  

View as plain text