lab.nexedi.com/kirr/go123@v0.0.0-20240207185015-8299741fa871/mem/mem.go (about)

     1  // Copyright (C) 2015-2017  Nexedi SA and Contributors.
     2  //                          Kirill Smelkov <kirr@nexedi.com>
     3  //
     4  // This program is free software: you can Use, Study, Modify and Redistribute
     5  // it under the terms of the GNU General Public License version 3, or (at your
     6  // option) any later version, as published by the Free Software Foundation.
     7  //
     8  // You can also Link and Combine this program with other software covered by
     9  // the terms of any of the Free Software licenses or any of the Open Source
    10  // Initiative approved licenses and Convey the resulting work. Corresponding
    11  // source of such a combination shall include the source code for all other
    12  // software used.
    13  //
    14  // This program is distributed WITHOUT ANY WARRANTY; without even the implied
    15  // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    16  //
    17  // See COPYING file for full licensing terms.
    18  // See https://www.nexedi.com/licensing for rationale and options.
    19  
    20  // Package mem provides reference-counted buffer and ways to work with memory
    21  // as either string or []byte without copying.
    22  package mem
    23  
    24  import (
    25  	"reflect"
    26  	"unsafe"
    27  )
    28  
    29  // Bytes converts string -> []byte without copying
    30  func Bytes(s string) []byte {
    31  	var b []byte
    32  	bp := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    33  	bp.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data
    34  	bp.Cap = len(s)
    35  	bp.Len = len(s)
    36  	return b
    37  }
    38  
    39  // String converts []byte -> string without copying
    40  func String(b []byte) string {
    41  	var s string
    42  	sp := (*reflect.StringHeader)(unsafe.Pointer(&s))
    43  	sp.Data = (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data
    44  	sp.Len = len(b)
    45  	return s
    46  }