summaryrefslogtreecommitdiff
path: root/utils/convert.go
diff options
context:
space:
mode:
Diffstat (limited to 'utils/convert.go')
-rw-r--r--utils/convert.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/utils/convert.go b/utils/convert.go
new file mode 100644
index 00000000..8d153ce5
--- /dev/null
+++ b/utils/convert.go
@@ -0,0 +1,34 @@
+package utils
+
+import (
+ "reflect"
+ "unsafe"
+)
+
+// AsBytes returns a slice that refers to the data backing the string s.
+func AsBytes(s string) []byte {
+ // get the pointer to the data of the string
+ p := unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&s)).Data)
+
+ var b []byte
+ hdr := (*reflect.SliceHeader)(unsafe.Pointer(&b))
+ hdr.Data = uintptr(p)
+ // we need to set the cap and len for the string to byte convert
+ // because string is shorter than []bytes
+ hdr.Cap = len(s)
+ hdr.Len = len(s)
+
+ return b
+}
+
+// AsString returns a string that refers to the data backing the slice s.
+func AsString(b []byte) string {
+ p := unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&b)).Data)
+
+ var s string
+ hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))
+ hdr.Data = uintptr(p)
+ hdr.Len = len(b)
+
+ return s
+}