github.com/pgavlin/text@v0.0.0-20240419000839-8438d0a47805/clone.go (about)

     1  // Copyright 2021 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package text
     6  
     7  import (
     8  	"unsafe"
     9  )
    10  
    11  // Clone returns a fresh copy of s.
    12  // It guarantees to make a copy of s into a new allocation,
    13  // which can be important when retaining only a small substring
    14  // of a much larger string. Using Clone can help such programs
    15  // use less memory. Of course, since using Clone makes a copy,
    16  // overuse of Clone can make programs use more memory.
    17  // Clone should typically be used only rarely, and only when
    18  // profiling indicates that it is needed.
    19  // For strings of length zero the string "" will be returned
    20  // and no allocation is made.
    21  func Clone[S String](s S) S {
    22  	if IsEmpty(s) {
    23  		return Empty[S]()
    24  	}
    25  
    26  	b := make([]byte, len(s))
    27  	copy(b, s)
    28  
    29  	if isString[S]() {
    30  		return S(unsafe.String(&b[0], len(b)))
    31  	}
    32  	return S(b)
    33  }