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 }