db

package
v0.0.0-...-1c4572a Latest Latest
Warning

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

Go to latest
Published: Nov 19, 2018 License: BSD-2-Clause Imports: 23 Imported by: 0

README

数据库配置选项说明

目前支持 leveldbbadger(测试阶段) 两种可选数据库做为KV数据存储,默认为leveldb
参考性能测试:https://github.com/suyanlong/dbcompare 总结出:

  • 优点:
    • badger在机械硬盘环境下,读写速度和leveldb相差不大,但在SSD固态硬盘环境下,读写速度都快于leveldb
    • badger的KV分离存储,所以相同数据情况下LSM会更小,可以全部加载到RAM,提高读写速度
  • 缺点:
    • badger的value是存储在valuelog中的,默认超过1KB的value才会压缩存储,会导致valuelog有很多冗余信息(可通过DB.RunValueLogGC()进行回收),占用磁盘空间会比leveldb多

leveldb

选用 leveldb 做为KV数据存储
修改chain33.toml文件中,[blockchain]、[store]、[wallet] 标签中driver的值为leveldb

{
    "driver": "leveldb"
}

badger

选用 badger 做为KV数据存储
修改chain33.toml文件中,[blockchain]、[store]、[wallet] 标签中driver的值为gobadgerdb

{
    "driver": "gobadgerdb"
}
  • 已知bugs:
    • 在windows环境下,系统重启后会因LOCK文件已存在,不能启动,需要手动删除 通过修改 vendor/github.com/dgraph-io/badger/dir_windows.go 72行暂时解决
    • 在0xff的情况下,边界测试有问题,详见db_test.go

实现自定义数据库接口说明

type DB interface {
	Get([]byte) []byte)		// 读
	Set([]byte, []byte)		// 写
	SetSync([]byte, []byte)		// 同步写
	Delete([]byte)			// 同步删除
	DeleteSync([]byte)		// 同步删除
	Close()				// 关闭数据库
	NewBatch(sync bool) Batch 	// 批量操作
	//迭代prefix 范围的所有key value, 支持正反顺序迭代
	Iterator(prefix []byte, key []byte, count int32, reserver bool) Iterator
	// For debugging
	Print()				// 调试打印
	Stats() map[string]string	// 数据库状态
}

type Batch interface {
	Set(key, value []byte)	// 写
	Delete(key []byte)	// 删除
	Write()			// 事务提交
}

Documentation

Index

Constants

View Source
const (
	ENDN = '\n'
	ENDR = '\r'

	OK       = "ok"
	NotFound = "not_found"

	ReadTimeOut  = 3
	WriteTimeOut = 3

	ReadBufSize = 8 * 1024

	IteratorPageSize = 10240

	PooledSize = 3
)
View Source
const (
	ListDESC = int32(0)
	ListASC  = int32(1)
	ListSeek = int32(2)
)

Variables

View Source
var ErrNotFoundInDb = errors.New("ErrNotFoundInDb")
View Source
var (
	FormatString = "%v\nthe trace error is\n%s"
)
View Source
var HashKeyLen = 24

Functions

func CopyBytes

func CopyBytes(b []byte) (copiedBytes []byte)

func GetKey

func GetKey(key []byte, version int64) ([]byte, error)

func GetKeyPerfix

func GetKeyPerfix(key []byte) []byte

func ToNum

func ToNum(bs []byte) int

Types

type Batch

type Batch interface {
	Set(key, value []byte)
	Delete(key []byte)
	Write() error
	ValueSize() int // amount of data in the batch
	Reset()         // Reset resets the batch for reuse
}

type DB

type DB interface {
	KV
	IteratorDB
	SetSync([]byte, []byte) error
	Delete([]byte) error
	DeleteSync([]byte) error
	Close()
	NewBatch(sync bool) Batch
	// For debugging
	Print()
	Stats() map[string]string
	SetCacheSize(size int)
	GetCache() *lru.ARCCache
}

func NewDB

func NewDB(name string, backend string, dir string, cache int32) DB

type GoBadgerDB

type GoBadgerDB struct {
	TransactionDB
	// contains filtered or unexported fields
}

func NewGoBadgerDB

func NewGoBadgerDB(name string, dir string, cache int) (*GoBadgerDB, error)

func (*GoBadgerDB) BatchGet

func (db *GoBadgerDB) BatchGet(keys [][]byte) (value [][]byte, err error)

func (*GoBadgerDB) Close

func (db *GoBadgerDB) Close()

func (*GoBadgerDB) DB

func (db *GoBadgerDB) DB() *badger.DB

func (*GoBadgerDB) Delete

func (db *GoBadgerDB) Delete(key []byte) error

func (*GoBadgerDB) DeleteSync

func (db *GoBadgerDB) DeleteSync(key []byte) error

func (*GoBadgerDB) Get

func (db *GoBadgerDB) Get(key []byte) ([]byte, error)

func (*GoBadgerDB) Iterator

func (db *GoBadgerDB) Iterator(start, end []byte, reverse bool) Iterator

func (*GoBadgerDB) NewBatch

func (db *GoBadgerDB) NewBatch(sync bool) Batch

func (*GoBadgerDB) Print

func (db *GoBadgerDB) Print()

func (*GoBadgerDB) Set

func (db *GoBadgerDB) Set(key []byte, value []byte) error

func (*GoBadgerDB) SetSync

func (db *GoBadgerDB) SetSync(key []byte, value []byte) error

func (*GoBadgerDB) Stats

func (db *GoBadgerDB) Stats() map[string]string

type GoBadgerDBBatch

type GoBadgerDBBatch struct {
	// contains filtered or unexported fields
}

func (*GoBadgerDBBatch) Delete

func (mBatch *GoBadgerDBBatch) Delete(key []byte)

func (*GoBadgerDBBatch) Reset

func (mBatch *GoBadgerDBBatch) Reset()

func (*GoBadgerDBBatch) Set

func (mBatch *GoBadgerDBBatch) Set(key, value []byte)

func (*GoBadgerDBBatch) ValueSize

func (mBatch *GoBadgerDBBatch) ValueSize() int

func (*GoBadgerDBBatch) Write

func (mBatch *GoBadgerDBBatch) Write() error

type GoLevelDB

type GoLevelDB struct {
	TransactionDB
	// contains filtered or unexported fields
}

func NewGoLevelDB

func NewGoLevelDB(name string, dir string, cache int) (*GoLevelDB, error)

func (*GoLevelDB) BatchGet

func (db *GoLevelDB) BatchGet(keys [][]byte) (value [][]byte, err error)

func (*GoLevelDB) Close

func (db *GoLevelDB) Close()

func (*GoLevelDB) DB

func (db *GoLevelDB) DB() *leveldb.DB

func (*GoLevelDB) Delete

func (db *GoLevelDB) Delete(key []byte) error

func (*GoLevelDB) DeleteSync

func (db *GoLevelDB) DeleteSync(key []byte) error

func (*GoLevelDB) Get

func (db *GoLevelDB) Get(key []byte) ([]byte, error)

func (*GoLevelDB) Iterator

func (db *GoLevelDB) Iterator(start []byte, end []byte, reverse bool) Iterator

func (*GoLevelDB) NewBatch

func (db *GoLevelDB) NewBatch(sync bool) Batch

func (*GoLevelDB) Print

func (db *GoLevelDB) Print()

func (*GoLevelDB) Set

func (db *GoLevelDB) Set(key []byte, value []byte) error

func (*GoLevelDB) SetSync

func (db *GoLevelDB) SetSync(key []byte, value []byte) error

func (*GoLevelDB) Stats

func (db *GoLevelDB) Stats() map[string]string

type GoMemDB

type GoMemDB struct {
	TransactionDB
	// contains filtered or unexported fields
}

func NewGoMemDB

func NewGoMemDB(name string, dir string, cache int) (*GoMemDB, error)

func (*GoMemDB) BatchGet

func (db *GoMemDB) BatchGet(keys [][]byte) (value [][]byte, err error)

func (*GoMemDB) Close

func (db *GoMemDB) Close()

func (*GoMemDB) DB

func (db *GoMemDB) DB() map[string][]byte

func (*GoMemDB) Delete

func (db *GoMemDB) Delete(key []byte) error

func (*GoMemDB) DeleteSync

func (db *GoMemDB) DeleteSync(key []byte) error

func (*GoMemDB) Get

func (db *GoMemDB) Get(key []byte) ([]byte, error)

func (*GoMemDB) Iterator

func (db *GoMemDB) Iterator(start []byte, end []byte, reverse bool) Iterator

func (*GoMemDB) NewBatch

func (db *GoMemDB) NewBatch(sync bool) Batch

func (*GoMemDB) Print

func (db *GoMemDB) Print()

func (*GoMemDB) Set

func (db *GoMemDB) Set(key []byte, value []byte) error

func (*GoMemDB) SetSync

func (db *GoMemDB) SetSync(key []byte, value []byte) error

func (*GoMemDB) Stats

func (db *GoMemDB) Stats() map[string]string

type GoSSDB

type GoSSDB struct {
	TransactionDB
	// contains filtered or unexported fields
}

func NewGoSSDB

func NewGoSSDB(name string, dir string, cache int) (*GoSSDB, error)

func (*GoSSDB) BatchGet

func (db *GoSSDB) BatchGet(keys [][]byte) (values [][]byte, err error)

func (*GoSSDB) Close

func (db *GoSSDB) Close()

func (*GoSSDB) Delete

func (db *GoSSDB) Delete(key []byte) error

func (*GoSSDB) DeleteSync

func (db *GoSSDB) DeleteSync(key []byte) error

func (*GoSSDB) Get

func (db *GoSSDB) Get(key []byte) ([]byte, error)

func (*GoSSDB) Iterator

func (db *GoSSDB) Iterator(itbeg []byte, itend []byte, reverse bool) Iterator

func (*GoSSDB) NewBatch

func (db *GoSSDB) NewBatch(sync bool) Batch

func (*GoSSDB) Print

func (db *GoSSDB) Print()

func (*GoSSDB) Set

func (db *GoSSDB) Set(key []byte, value []byte) error

func (*GoSSDB) SetSync

func (db *GoSSDB) SetSync(key []byte, value []byte) error

func (*GoSSDB) Stats

func (db *GoSSDB) Stats() map[string]string

type Iterator

type Iterator interface {
	IteratorSeeker
	Valid() bool
	Key() []byte
	Value() []byte
	ValueCopy() []byte
	Error() error
	Prefix() []byte
	Close()
}

type IteratorDB

type IteratorDB interface {
	Iterator(start []byte, end []byte, reserver bool) Iterator
}

type IteratorSeeker

type IteratorSeeker interface {
	Rewind() bool
	Seek(key []byte) bool
	Next() bool
}

type KV

type KV interface {
	Get(key []byte) ([]byte, error)
	BatchGet(keys [][]byte) (values [][]byte, err error)
	Set(key []byte, value []byte) (err error)
	Begin()
	Rollback()
	Commit()
}

type KVDB

type KVDB interface {
	KV
	Lister
}

func NewKVDB

func NewKVDB(db DB) KVDB

type KVDBList

type KVDBList struct {
	DB
	// contains filtered or unexported fields
}

func (*KVDBList) List

func (l *KVDBList) List(prefix, key []byte, count, direction int32) ([][]byte, error)

func (*KVDBList) PrefixCount

func (l *KVDBList) PrefixCount(prefix []byte) int64

type ListHelper

type ListHelper struct {
	// contains filtered or unexported fields
}

func NewListHelper

func NewListHelper(db IteratorDB) *ListHelper

func (*ListHelper) IteratorCallback

func (db *ListHelper) IteratorCallback(start []byte, end []byte, count int32, direction int32, fn func(key, value []byte) bool)

func (*ListHelper) IteratorScan

func (db *ListHelper) IteratorScan(prefix []byte, key []byte, count int32, direction int32) (values [][]byte)

func (*ListHelper) IteratorScanFromFirst

func (db *ListHelper) IteratorScanFromFirst(prefix []byte, count int32) (values [][]byte)

func (*ListHelper) IteratorScanFromLast

func (db *ListHelper) IteratorScanFromLast(prefix []byte, count int32) (values [][]byte)

func (*ListHelper) List

func (db *ListHelper) List(prefix, key []byte, count, direction int32) (values [][]byte)

func (*ListHelper) PrefixCount

func (db *ListHelper) PrefixCount(prefix []byte) (count int64)

func (*ListHelper) PrefixScan

func (db *ListHelper) PrefixScan(prefix []byte) (values [][]byte)

type Lister

type Lister interface {
	List(prefix, key []byte, count, direction int32) ([][]byte, error)
	PrefixCount(prefix []byte) int64
}

type MVCC

type MVCC interface {
	MVCCKV
	SetVersion(hash []byte, version int64) error
	DelVersion(hash []byte) error
	GetVersion(hash []byte) (int64, error)
	GetV(key []byte, version int64) ([]byte, error)
	SetV(key []byte, value []byte, version int64) error
	DelV(key []byte, version int64) error
	AddMVCC(kvs []*types.KeyValue, hash []byte, prevHash []byte, version int64) ([]*types.KeyValue, error)
	DelMVCC(hash []byte, version int64, strict bool) ([]*types.KeyValue, error)
	GetMaxVersion() (int64, error)
	GetVersionHash(version int64) ([]byte, error)
	//回收: 某个版本之前的所有数据
	//1. 保证有一个最新版本
	//2. 这个操作回遍历所有的key所以比较慢
	Trash(version int64) error
}

MVCC mvcc interface

type MVCCHelper

type MVCCHelper struct {
	*SimpleMVCC
	// contains filtered or unexported fields
}

MVCCHelper impl MVCC interface

func NewMVCC

func NewMVCC(db DB) *MVCCHelper

NewMVCC create MVCC object use db DB

func (*MVCCHelper) DelV

func (m *MVCCHelper) DelV(key []byte, version int64) error

DelV del key with version

func (*MVCCHelper) DelVersion

func (m *MVCCHelper) DelVersion(hash []byte) error

DelVersion del stateHash version map

func (*MVCCHelper) PrintAll

func (m *MVCCHelper) PrintAll()

func (*MVCCHelper) SetVersion

func (m *MVCCHelper) SetVersion(hash []byte, version int64) error

SetVersion set stateHash -> version map

func (*MVCCHelper) Trash

func (m *MVCCHelper) Trash(version int64) error

Trash del some old kv

type MVCCIter

type MVCCIter struct {
	*MVCCHelper
}

mvcc 迭代器版本 支持db 原生迭代器接口 为了支持快速迭代,我这里采用了复制数据的做法

func NewMVCCIter

func NewMVCCIter(db DB) *MVCCIter

func (*MVCCIter) AddMVCC

func (m *MVCCIter) AddMVCC(kvs []*types.KeyValue, hash []byte, prevHash []byte, version int64) ([]*types.KeyValue, error)

func (*MVCCIter) DelMVCC

func (m *MVCCIter) DelMVCC(hash []byte, version int64, strict bool) ([]*types.KeyValue, error)

func (*MVCCIter) Iterator

func (m *MVCCIter) Iterator(start, end []byte, reserver bool) Iterator

type MVCCKV

type MVCCKV interface {
	GetSaveKV(key []byte, value []byte, version int64) (*types.KeyValue, error)
	GetDelKV(key []byte, version int64) (*types.KeyValue, error)
	SetVersionKV(hash []byte, version int64) ([]*types.KeyValue, error)
	DelVersionKV([]byte, int64) ([]*types.KeyValue, error)
}

MVCCKV only return kv when change database

type PegasusBatch

type PegasusBatch struct {
	// contains filtered or unexported fields
}

func (*PegasusBatch) Delete

func (db *PegasusBatch) Delete(key []byte)

func (*PegasusBatch) Reset

func (db *PegasusBatch) Reset()

func (*PegasusBatch) Set

func (db *PegasusBatch) Set(key, value []byte)

func (*PegasusBatch) ValueSize

func (db *PegasusBatch) ValueSize() int

func (*PegasusBatch) Write

func (db *PegasusBatch) Write() error

注意本方法的实现逻辑,因为ssdb没有提供删除和更新同时进行的批量操作; 所以这里先执行更新操作(删除的KEY在这里会将VALUE设置为空); 然后再执行删除操作; 这样即使中间执行出错,也不会导致删除结果未写入的情况(值已经被置空);

type PegasusDB

type PegasusDB struct {
	TransactionDB
	// contains filtered or unexported fields
}

func NewPegasusDB

func NewPegasusDB(name string, dir string, cache int) (*PegasusDB, error)

func (*PegasusDB) BatchGet

func (db *PegasusDB) BatchGet(keys [][]byte) (values [][]byte, err error)

func (*PegasusDB) Close

func (db *PegasusDB) Close()

func (*PegasusDB) Delete

func (db *PegasusDB) Delete(key []byte) error

func (*PegasusDB) DeleteSync

func (db *PegasusDB) DeleteSync(key []byte) error

func (*PegasusDB) Get

func (db *PegasusDB) Get(key []byte) ([]byte, error)

func (*PegasusDB) Iterator

func (db *PegasusDB) Iterator(begin []byte, end []byte, reverse bool) Iterator

func (*PegasusDB) NewBatch

func (db *PegasusDB) NewBatch(sync bool) Batch

func (*PegasusDB) Print

func (db *PegasusDB) Print()

func (*PegasusDB) Set

func (db *PegasusDB) Set(key []byte, value []byte) error

func (*PegasusDB) SetSync

func (db *PegasusDB) SetSync(key []byte, value []byte) error

func (*PegasusDB) Stats

func (db *PegasusDB) Stats() map[string]string

type PegasusIt

type PegasusIt struct {
	// contains filtered or unexported fields
}

func (*PegasusIt) Close

func (dbit *PegasusIt) Close()

func (*PegasusIt) Error

func (dbit *PegasusIt) Error() error

func (*PegasusIt) Key

func (dbit *PegasusIt) Key() []byte

func (*PegasusIt) Next

func (dbit *PegasusIt) Next() bool

func (*PegasusIt) Prefix

func (it *PegasusIt) Prefix() []byte

func (*PegasusIt) Rewind

func (dbit *PegasusIt) Rewind() bool

func (*PegasusIt) Seek

func (dbit *PegasusIt) Seek(key []byte) bool

func (*PegasusIt) Valid

func (dbit *PegasusIt) Valid() bool

func (*PegasusIt) Value

func (dbit *PegasusIt) Value() []byte

func (*PegasusIt) ValueCopy

func (dbit *PegasusIt) ValueCopy() []byte

type RoundInt

type RoundInt struct {
	// contains filtered or unexported fields
}

type SDBClient

type SDBClient struct {
	// contains filtered or unexported fields
}

func Connect

func Connect(ip string, port int) (*SDBClient, error)

func (*SDBClient) Close

func (c *SDBClient) Close() error

Close The Client Connection

func (*SDBClient) Del

func (c *SDBClient) Del(key string) error

删除指定 key

key 要删除的 key
返回 err,执行的错误,操作成功返回 nil

func (*SDBClient) Do

func (c *SDBClient) Do(args ...interface{}) ([]string, error)

func (*SDBClient) Get

func (c *SDBClient) Get(key string) (*Value, error)

获取指定 key 的值内容

key 键值
返回 一个 Value,可以方便的向其它类型转换
返回 一个可能的错误,操作成功返回 nil

func (*SDBClient) Keys

func (c *SDBClient) Keys(keyStart, keyEnd string, limit int64) ([]string, error)

列出处于区间 (key_start, key_end] 的 key 列表.("", ""] 表示整个区间.

keyStart int 返回的起始 key(不包含), 空字符串表示 -inf.
keyEnd int 返回的结束 key(包含), 空字符串表示 +inf.
limit int 最多返回这么多个元素.
返回 返回包含 key 的数组.
返回 err,可能的错误,操作成功返回 nil

func (*SDBClient) MultiDel

func (c *SDBClient) MultiDel(key ...string) (err error)

批量删除一批 key 和其对应的值内容.

key,要删除的 key,可以为多个
返回 err,可能的错误,操作成功返回 nil

func (*SDBClient) MultiGet

func (c *SDBClient) MultiGet(key ...string) (vals []*Value, err error)

批量删除一批 key 和其对应的值内容.

key,要删除的 key,可以为多个
返回 err,可能的错误,操作成功返回 nil

func (*SDBClient) MultiSet

func (c *SDBClient) MultiSet(kvs map[string][]byte) (err error)

批量设置一批 key-value.

包含 key-value 的字典
返回 err,可能的错误,操作成功返回 nil

func (*SDBClient) Rkeys

func (c *SDBClient) Rkeys(keyStart, keyEnd string, limit int64) ([]string, error)

列出处于区间 (key_start, key_end] 的 key 列表.("", ""] 表示整个区间.反向选择

keyStart int 返回的起始 key(不包含), 空字符串表示 -inf.
keyEnd int 返回的结束 key(包含), 空字符串表示 +inf.
limit int 最多返回这么多个元素.
返回 返回包含 key 的数组.
返回 err,可能的错误,操作成功返回 nil

func (*SDBClient) Set

func (c *SDBClient) Set(key string, val []byte) (err error)

设置指定 key 的值内容

key 键值
val 存贮的 value 值,val只支持基本的类型,如果要支持复杂的类型,需要开启连接池的 Encoding 选项
ttl 可选,设置的过期时间,单位为秒
返回 err,可能的错误,操作成功返回 nil

type SDBPool

type SDBPool struct {
	// contains filtered or unexported fields
}

func NewSDBPool

func NewSDBPool(nodes []*SsdbNode) (pool *SDBPool, err error)

type SimpleMVCC

type SimpleMVCC struct {
	// contains filtered or unexported fields
}

func NewSimpleMVCC

func NewSimpleMVCC(db KVDB) *SimpleMVCC

func (*SimpleMVCC) AddMVCC

func (m *SimpleMVCC) AddMVCC(kvs []*types.KeyValue, hash []byte, prevHash []byte, version int64) ([]*types.KeyValue, error)

AddMVCC add keys in a version 添加MVCC的规则: 必须提供现有hash 和 prev 的hash, 而且这两个版本号相差1

func (*SimpleMVCC) DelMVCC

func (m *SimpleMVCC) DelMVCC(hash []byte, version int64, strict bool) ([]*types.KeyValue, error)

DelMVCC 删除某个版本 我们目前规定删除的方法: 1 -> 1-2-3-4-5,6 version 必须连续的增长 2 -> del 也必须从尾部开始删除

func (*SimpleMVCC) DelVersionKV

func (m *SimpleMVCC) DelVersionKV(hash []byte, version int64) ([]*types.KeyValue, error)

DelVersionKV only export del version key value

func (*SimpleMVCC) GetDelKV

func (m *SimpleMVCC) GetDelKV(key []byte, version int64) (*types.KeyValue, error)

GetDelKV only export del key and value with version

func (*SimpleMVCC) GetDelKVList

func (m *SimpleMVCC) GetDelKVList(version int64) ([]*types.KeyValue, error)

func (*SimpleMVCC) GetMaxVersion

func (m *SimpleMVCC) GetMaxVersion() (int64, error)

func (*SimpleMVCC) GetSaveKV

func (m *SimpleMVCC) GetSaveKV(key []byte, value []byte, version int64) (*types.KeyValue, error)

GetSaveKV only export set key and value with version

func (*SimpleMVCC) GetV

func (m *SimpleMVCC) GetV(key []byte, version int64) ([]byte, error)

GetV get key with version

func (*SimpleMVCC) GetVersion

func (m *SimpleMVCC) GetVersion(hash []byte) (int64, error)

GetVersion get stateHash and version map

func (*SimpleMVCC) GetVersionHash

func (m *SimpleMVCC) GetVersionHash(version int64) ([]byte, error)

func (*SimpleMVCC) SetV

func (m *SimpleMVCC) SetV(key []byte, value []byte, version int64) error

SetV set key and value with version

func (*SimpleMVCC) SetVersionKV

func (m *SimpleMVCC) SetVersionKV(hash []byte, version int64) ([]*types.KeyValue, error)

SetVersionKV only export SetVersionKV key and value

type SsdbBench

type SsdbBench struct {
	// contains filtered or unexported fields
}

func (*SsdbBench) String

func (bench *SsdbBench) String() string

type SsdbNode

type SsdbNode struct {
	// contains filtered or unexported fields
}

type TransactionDB

type TransactionDB struct {
	// contains filtered or unexported fields
}

func (*TransactionDB) Begin

func (db *TransactionDB) Begin()

func (*TransactionDB) Commit

func (db *TransactionDB) Commit()

func (*TransactionDB) GetCache

func (db *TransactionDB) GetCache() *lru.ARCCache

func (*TransactionDB) Rollback

func (db *TransactionDB) Rollback()

func (*TransactionDB) SetCacheSize

func (db *TransactionDB) SetCacheSize(size int)

type Value

type Value struct {
	// contains filtered or unexported fields
}

扩展值,原始类型为 string

func (*Value) Bytes

func (v *Value) Bytes() []byte

返回 []byte 类型的值

func (*Value) String

func (v *Value) String() string

返回 string 的值

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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