package main
import (
"fmt"
"reflect"
"unsafe"
)
type kv struct {
key []byte
value []byte
}
type sliceMap []kv
func (sm *sliceMap) Add(k, v []byte) {
kvs := *sm
fmt.Printf("cap(kvs) = %d, len(kvs) = %d, kvs = %s\n", cap(kvs), len(kvs), kvs)
if cap(kvs) > len(kvs) {
fmt.Println(1111111)
kvs = kvs[:len(kvs)+1]
} else {
fmt.Println(2222222)
kvs = append(kvs, kv{})
}
kv := &kvs[len(kvs)-1]
kv.key = append(kv.key[:0], k...)
kv.value = append(kv.value[:0], v...)
fmt.Println(kvs)
*sm = kvs
}
func b2s(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
func s2b(s string) (b []byte) {
bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
bh.Data = sh.Data
bh.Cap = sh.Len
bh.Len = sh.Len
return b
}
func main() {
var sm sliceMap
sm.Add([]byte("key1"), []byte("value1"))
sm.Add([]byte("key2"), []byte("value2"))
sm.Add([]byte("key3"), []byte("value3"))
sm.Add([]byte("key4"), []byte("value4"))
sm.Add([]byte("key5"), []byte("value5"))
sm.Add([]byte("key6"), []byte("value6"))
for _, kv := range sm {
fmt.Printf("Key: %s, Value: %s\n", kv.key, kv.value)
}
}