redis1.2.6 go复写sds基本函数

redis1.2.6 go复写sds基本函数,第1张

package sds

import (
	"fmt"
	"strings"
	"unsafe"
)

type Sds *[]byte

type sdshdr struct {
	len  int64
	free int64
	buf  []byte
}

// Sdsnewlen 初始化sdshdr
func Sdsnewlen(init []byte, initlen int64) Sds {
	var sh *sdshdr
	sh = new(sdshdr)
	sh.buf = make([]byte, initlen+1)
	//初始化
	sh.len = initlen
	sh.free = 0
	if initlen > 0 {
		if init != nil {
			copy(sh.buf, init[:initlen])
		}
	}
	fmt.Printf("sh.buf=%s  sh=%p,sh.buf=%p\n", sh.buf, sh, &sh.buf)
	//sh.buf[initlen] = 0
	return &sh.buf
}

//Sdsnew 创建一个sds
func Sdsnew(init []byte) Sds {
	var initlen int64 = 0
	if init != nil {
		initlen = int64(len(init))
	}
	return Sdsnewlen(init, initlen)
}

//Sdsempty 设置个空的sds和sdshdr
func Sdsempty() Sds {
	return Sdsnewlen([]byte(""), 0)
}

//Sdslen 长度
func Sdslen(s Sds) int64 {
	sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
	return sh.len
}

//Sdsdup 传入一个sds获取一个和旧sds值一样的新sds
func Sdsdup(s Sds) Sds {
	return Sdsnewlen(*s, Sdslen(s))
}

//Sdsavail 获取free
func Sdsavail(s Sds) int64 {
	sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
	return sh.free
}

//Sdsupdatelen 更新sds对应sdshdr的len和free
func Sdsupdatelen(s Sds) {
	sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
	realLen := int64(len(*s) - 1) //减去0
	sh.free += sh.len - realLen
	sh.len = realLen
}

//sdsMakeRoomFor 分配长度 free不够的话 重新分配(slen+addLen)*2的长度
func sdsMakeRoomFor(s Sds, addLen int64) Sds {
	free := Sdsavail(s)
	if free >= addLen {
		return s
	}
	slen := Sdslen(s)
	sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
	newLen := (slen + addLen) * 2

	oldBuf := sh.buf
	sh.buf = make([]byte, newLen+1)
	copy(sh.buf, oldBuf)
	sh.free = newLen - slen
	return &sh.buf
}

//Sdscatlen 追加指定长度的字符串
func Sdscatlen(s Sds, ns []byte, nsLen int64) Sds {
	curLen := Sdslen(s)
	s = sdsMakeRoomFor(s, nsLen)
	sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
	copy(sh.buf[curLen:], ns[:nsLen])
	sh.len = curLen + nsLen
	sh.free -= nsLen
	sh.buf[curLen+nsLen] = 0
	return &sh.buf
}

//Sdscat 将ns字符串追加到s中
func Sdscat(s Sds, ns []byte) Sds {
	return Sdscatlen(s, ns, int64(len(ns)))
}

//Sdscpylen 将指定长度的字符串覆盖写入到s中
func Sdscpylen(s Sds, ns []byte, nsLen int64) Sds {
	sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
	totLen := sh.len + sh.free

	if totLen < nsLen {
		sdsMakeRoomFor(s, nsLen)
		totLen = sh.len + sh.free
	}
	copy(sh.buf, ns)
	for i, v := range sh.buf[nsLen:] {
		if v == 0 {
			break
		}
		sh.buf[nsLen+int64(i)] = 0
	}
	sh.len = nsLen
	sh.free = totLen - sh.len
	return &sh.buf
}

//Sdscpy 将字符串覆盖写入到s中
func Sdscpy(s Sds, ns []byte) Sds {
	return Sdscpylen(s, ns, int64(len(ns)))
}

//变为小写
func Sdstolower(s Sds) Sds {
	//内置
	sstr := string(*s)
	sstr = strings.ToLower(sstr)
	return Sdscpy(s, []byte(sstr))
}

//变为大写
func Sdstoupper(s Sds) Sds {
	//内置
	sstr := string(*s)
	sstr = strings.ToUpper(sstr)
	return Sdscpy(s, []byte(sstr))
}

//比较两个字符串
func sdscmp(s1 Sds, s2 Sds) int {
	return strings.Compare(string(*s1), string(*s2))
}

main函数测试

func main() {
	name := "wwz"
	nameSds := sds.Sdsnew([]byte(name))
	fmt.Printf("调用 Sdsnew 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))

	nameSds = sds.Sdscat(nameSds, []byte(" hello world"))
	fmt.Printf("调用 Sdscat 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))

	nameSds = sds.Sdscpy(nameSds, []byte("sds sds"))
	fmt.Printf("调用 Sdscpy 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))

	nameSds = sds.Sdstoupper(nameSds)
	fmt.Printf("调用 nameSds 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))

	nameSds = sds.Sdstolower(nameSds)
	fmt.Printf("调用 Sdstolower 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))

}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/990910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存