From 5d8805c735f7399e17fd02bbbc032fead803c2fb Mon Sep 17 00:00:00 2001
From: q191201771 <191201771@qq.com>
Date: Mon, 7 Oct 2019 10:43:26 +0800
Subject: [PATCH] 1. new package nazastring 2. badge line size
---
README.md | 2 +-
pkg/nazastring/string.go | 24 +++++++++++++++
pkg/nazastring/string_test.go | 56 +++++++++++++++++++++++++++++++++++
3 files changed, 81 insertions(+), 1 deletion(-)
create mode 100644 pkg/nazastring/string.go
create mode 100644 pkg/nazastring/string_test.go
diff --git a/README.md b/README.md
index 2fb8ebb..deac216 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ Go语言基础库
-
+
diff --git a/pkg/nazastring/string.go b/pkg/nazastring/string.go
new file mode 100644
index 0000000..66e77ca
--- /dev/null
+++ b/pkg/nazastring/string.go
@@ -0,0 +1,24 @@
+package nazastring
+
+import "unsafe"
+
+type sliceT struct {
+ array unsafe.Pointer
+ len int
+ cap int
+}
+
+type stringStruct struct {
+ str unsafe.Pointer
+ len int
+}
+
+func SliceByteToStringTmp(b []byte) string {
+ return *(*string)(unsafe.Pointer(&b))
+}
+
+func StringToSliceByteTmp(s string) []byte {
+ str := (*stringStruct)(unsafe.Pointer(&s))
+ ret := sliceT{array: unsafe.Pointer(str.str), len: str.len, cap: str.len}
+ return *(*[]byte)(unsafe.Pointer(&ret))
+}
diff --git a/pkg/nazastring/string_test.go b/pkg/nazastring/string_test.go
new file mode 100644
index 0000000..08138e9
--- /dev/null
+++ b/pkg/nazastring/string_test.go
@@ -0,0 +1,56 @@
+package nazastring
+
+import (
+ "bytes"
+ "github.com/q191201771/naza/pkg/assert"
+ "testing"
+)
+
+var inbuf = bytes.Repeat([]byte{'1', '2', '3', '4'}, 5678)
+var instr = string(inbuf)
+
+func TestSliceByteToStringTmp(t *testing.T) {
+ str := SliceByteToStringTmp(inbuf)
+ assert.Equal(t, instr, str)
+}
+
+func TestStringToSliceByteTmp(t *testing.T) {
+ buf := StringToSliceByteTmp(instr)
+ assert.Equal(t, inbuf, buf)
+}
+
+func BenchmarkSliceByteToStringOrigin(b *testing.B) {
+ var str string
+
+ for i := 0; i < b.N; i++ {
+ str = string(inbuf)
+ }
+ assert.Equal(b, instr, str)
+}
+
+func BenchmarkSliceByteToStringTmp(b *testing.B) {
+ var str string
+
+ for i := 0; i < b.N; i++ {
+ str = SliceByteToStringTmp(inbuf)
+ }
+ assert.Equal(b, instr, str)
+}
+
+func BenchmarkStringToSliceByteOrigin(b *testing.B) {
+ var buf []byte
+
+ for i := 0; i < b.N; i++ {
+ buf = []byte(instr)
+ }
+ assert.Equal(b, buf, inbuf)
+}
+
+func BenchmarkStringToSliceByteTmp(b *testing.B) {
+ var buf []byte
+
+ for i := 0; i < b.N; i++ {
+ buf = StringToSliceByteTmp(instr)
+ }
+ assert.Equal(b, buf, inbuf)
+}