exstrings

package
v0.0.0-...-261b507 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 27, 2019 License: GPL-3.0 Imports: 7 Imported by: 0

Documentation

Overview

Package exstrings 收集常规的 string 操作,作为 go 标准库 strings 的扩展。 避免重复编写 string 相关操作代码,集中在一起更有利于优化代码,保证代码质量。

这个包会使用一些特殊的操作来减少内存开销,已获得更好的程序性能。

我也会在这个包重写 标准库 strings 里面的一些方法,以适用于不同场景的性能优化。

Index

Constants

View Source
const (
	// PadLeft 在左侧填充字符串为指定长度。
	PadLeft = iota

	// PadBoth 在两边填充字符串为指定长度,如果补充长度是奇数,右边的字符会更多一些。
	PadBoth

	// PadRight 在右侧填充字符串为指定长度。
	PadRight
)

Variables

This section is empty.

Functions

func BothPad

func BothPad(s, pad string, c int) string

BothPad 使用另一个字符串从两端填充字符串为指定长度, 如果补充长度是奇数,右边的字符会更多一些。

func Join

func Join(a []string, sep string) string

Join 使用 sep 连接 a 的字符串。 该方法是对标准库 strings.Join 修改,配合 unsafe 包能有效减少内存分配。

func JoinInt16s

func JoinInt16s(i []int16, sep string) string

JoinInt16s 使用 sep 连接 []int16 并返回连接的字符串

func JoinInt32s

func JoinInt32s(i []int32, sep string) string

JoinInt32s 使用 sep 连接 []int32 并返回连接的字符串

func JoinInt64s

func JoinInt64s(i []int64, sep string) string

JoinInt64s 使用 sep 连接 []int64 并返回连接的字符串

func JoinInt8s

func JoinInt8s(i []int8, sep string) string

JoinInt8s 使用 sep 连接 []int8 并返回连接的字符串

func JoinInts

func JoinInts(i []int, sep string) string

JoinInts 使用 sep 连接 []int 并返回连接的字符串

func JoinToBytes

func JoinToBytes(a []string, sep string) []byte

JoinToBytes 使用 sep 连接 a 的字符串并返回 []byte 该方法是对标准库 strings.Join 修改,配合 unsafe 包能有效减少内存分配。

func JoinUint16s

func JoinUint16s(i []uint16, sep string) string

JoinUint16s 使用 sep 连接 []uint16 并返回连接的字符串

func JoinUint32s

func JoinUint32s(i []uint32, sep string) string

JoinUint32s 使用 sep 连接 []uint32 并返回连接的字符串

func JoinUint64s

func JoinUint64s(i []uint64, sep string) string

JoinUint64s 使用 sep 连接 []uint64 并返回连接的字符串

func JoinUint8s

func JoinUint8s(i []uint8, sep string) string

JoinUint8s 使用 sep 连接 []uint8 并返回连接的字符串

func JoinUints

func JoinUints(i []uint, sep string) string

JoinUints 使用 sep 连接 []uint 并返回连接的字符串

func LeftPad

func LeftPad(s, pad string, c int) string

LeftPad 使用另一个字符串从左端填充字符串为指定长度。

func Pad

func Pad(s, pad string, c, falg int) string

Pad 使用另一个字符串填充字符串为指定长度。

该函数返回 s 被从左端、右端或者同时两端被填充到制定长度后的结果。 填充方向由 falg 控制,可选值:PadLeft、PadBoth、PadRight。

在两边填充字符串为指定长度,如果补充长度是奇数,右边的字符会更多一些。

func Repeat

func Repeat(s string, count int) string

Repeat 返回由字符串s的计数副本组成的新字符串。 该方法是对标准库 strings.Repeat 修改,对于创建大字符串能有效减少内存分配。

如果计数为负或 len(s) * count 溢出将触发panic。

func RepeatToBytes

func RepeatToBytes(s string, count int) []byte

RepeatToBytes 返回由字符串s的计数副本组成的 []byte。 该方法是对标准库 strings.Repeat 修改,对于创建大字符串能有效减少内存分配。

如果计数为负或 len(s) * count 溢出将触发panic。

func Replace

func Replace(s, old, new string, n int) string

Replace 替换字符串 该方法是对标准库 strings.Replace 修改,配合 unsafe 包能有效减少内存分配。

func ReplaceToBytes

func ReplaceToBytes(s, old, new string, n int) []byte

ReplaceToBytes 替换字符串,并返回 []byte,减少类型转换 如果在字符串串中找不到子串,会发生内存拷贝 这个方法返回的 []byte 是安全,可以进行修改

func Reverse

func Reverse(s string) string

Reverse 反转字符串,通过 https://golang.org/doc/code.html#Library 收集

func RightPad

func RightPad(s, pad string, c int) string

RightPad 使用另一个字符串从右端填充字符串为指定长度。

func UnsafeBothPad

func UnsafeBothPad(s, pad string, c int) string

UnsafeBothPad 使用另一个字符串从两端填充字符串为指定长度, 如果补充长度是奇数,右边的字符会更多一些。

该函数使用 unsafe 包转换数据类型,降低内存分配。 Deprecated: 不在使用 Unsafe 前缀

func UnsafeJoin deprecated

func UnsafeJoin(a []string, sep string) string

UnsafeJoin 使用 sep 连接 a 的字符串。 该方法是对标准库 strings.Join 修改,配合 unsafe 包能有效减少内存分配。

Deprecated: 不在使用 Unsafe 前缀,保持与标准库相同的命名

func UnsafeLeftPad

func UnsafeLeftPad(s, pad string, c int) string

UnsafeLeftPad 使用另一个字符串从左端填充字符串为指定长度。

该函数使用 unsafe 包转换数据类型,降低内存分配。 Deprecated: 不在使用 Unsafe 前缀

func UnsafePad deprecated

func UnsafePad(s, pad string, c, falg int) string

UnsafePad 使用另一个字符串填充字符串为指定长度。

该函数使用 unsafe 包转换数据类型,降低内存分配。

该函数返回 s 被从左端、右端或者同时两端被填充到制定长度后的结果。 填充方向由 falg 控制,可选值:PadLeft、PadBoth、PadRight。

在两边填充字符串为指定长度,如果补充长度是奇数,右边的字符会更多一些。

Deprecated: 不在使用 Unsafe 前缀

func UnsafeRepeat deprecated

func UnsafeRepeat(s string, count int) string

UnsafeRepeat 返回由字符串s的计数副本组成的新字符串。 该方法是对标准库 strings.Repeat 修改,对于创建大字符串能有效减少内存分配。

如果计数为负或 len(s) * count 溢出将触发panic。

与标准库的性能差异(接近标准库性能的两倍):

BenchmarkUnsafeRepeat-8            	   50000	     28003 ns/op	  303104 B/op	       1 allocs/op
BenchmarkStandardLibraryRepeat-8   	   30000	     50619 ns/op	  606208 B/op	       2 allocs/op

Deprecated: 不在使用 Unsafe 前缀,保持与标准库相同的命名

func UnsafeReplace deprecated

func UnsafeReplace(s, old, new string, n int) string

UnsafeReplace 替换字符串 该方法是对标准库 strings.Replace 修改,配合 unsafe 包能有效减少内存分配。

Deprecated: 不在使用 Unsafe 前缀,保持与标准库相同的命名

func UnsafeReplaceToBytes

func UnsafeReplaceToBytes(s, old, new string, n int) []byte

UnsafeReplaceToBytes 替换字符串,并返回 []byte,减少类型转换 如果输入是字面量字符串,返回结果不可以修改

func UnsafeRightPad

func UnsafeRightPad(s, pad string, c int) string

UnsafeRightPad 使用另一个字符串从右端填充字符串为指定长度。

该函数使用 unsafe 包转换数据类型,降低内存分配。 Deprecated: 不在使用 Unsafe 前缀

func UnsafeToBytes

func UnsafeToBytes(s string) []byte

UnsafeToBytes 把 string 转换为 []byte 没有多余的内存开销。

这个函数可以提升 string 转 []byte 的性能,并极大的降低内存开销,但是却相当的危险,对于不明确这个函数的人来说不建议使用该函数。

这个函数是 exbytes.ToString 反向操作版,但是不像 exbytes.ToString 那么的稳定安全,该函数使用不当会导致程序直接崩溃,且无法恢复。

s := `{"k":"v"}`

b := exstrings.UnsafeToBytes(s)
// b[3] = 'k' // unexpected fault address 0x1118180
data := map[string]string{}
err := json.Unmarshal(b, &data)

fmt.Println(data, err)

这是一个使用的例子,如果我们需要转换一个字符串很方便,且开销非常的低。 但是一定要注意,b[3] = 'k' 如果尝试修改获得的 []byte 将直接导致程序崩溃,并且不可能通过 recover() 恢复。

实际上我们可以突破这个限制,这就要了解字符串的一些规则,下面的例子可以完美运行,并修改字符串:

s := strings.Repeat("A", 3)
b := exstrings.UnsafeToBytes(s)
b[1] = 'B'
b[2] = 'C'

fmt.Println(s, string(b))

非常完美,s和b变量的值都是 ABC, 为什么会这样呢?

这个就是 string 的内存分配方法, 字面量使用这种方式是没有办法修改的,因为这是在编译时就决定的,编译时会设定字符串的内存数据是只读数据。 如果程序运行时生成的数据,这种数据是可以安全使用该函数的,但是要当心你的字符串可能会被修改, 比如我们调用 json.Unmarshal(exstrings.UnsafeToBytes(s), &data), 如果 json 包里面出现修改输入参数,那么原来的字符串就可能不是你想想的那样。

使用该函数要明确两个事情:

  • 确定字符串是否是字面量,或者内存被分配在只读空间上。
  • 确保访问该函数结果的函数是否会按照你的意愿访问或修改数据。

我公开该函数经过很多思考,虽然它很危险,但是有时间却很有用,如果我们需要大批量转换字符串的大小写,而且不再需要原字符串,我们可以原地安全的修改字符串。 当然还有更多的使用方法,可以极大的提升我们程序的性能。

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL