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) +}