type ReadWriter interface {
Read(b []byte) (n int, err error)
Write(b []byte) (n int, err error)
}
// EntityStorage defines the interface of entity storage backends
type EntityStorage interface {
List(typeName string) ([]common.EntityID, error)
Write(typeName string, entityID common.EntityID, data interface{}) error
Read(typeName string, entityID common.EntityID) (interface{}, error)
Exists(typeName string, entityID common.EntityID) (bool, error)
Close()
IsEOF(err error) bool
}
// OpenRedis opens redis as entity storage
func OpenRedis(url string, dbindex int) *redisEntityStorage {
c, err := redis.DialURL(url)
if err != nil {
return nil
}
if dbindex >= 0 {
if _, err := c.Do("SELECT", dbindex); err != nil {
return nil
}
}
es := &redisEntityStorage{
c: c,
}
return es
}
var storageEngine StorageEngine // 这是一个全局变量
storageEngine = OpenRedis(cfg.Url, dbindex)
if storageEngine != nil {
// 连接成功
...
} else {
// 连接失败
...
}
// InterfaceStructure 定义了一个interface{}的内部结构
type InterfaceStructure struct {
pt uintptr // 到值类型的指针
pv uintptr // 到值内容的指针
}
// asInterfaceStructure 将一个interface{}转换为InterfaceStructure
func asInterfaceStructure (i interface{}) InterfaceStructure {
return *(*InterfaceStructure)(unsafe.Pointer(&i))
}
func TestInterfaceStructure(t *testing.T) {
var i1, i2 interface{}
var v1 int = 0x0AAAAAAAAAAAAAAA
var v2 int = 0x0BBBBBBBBBBBBBBB
i1 = v1
i2 = v2
fmt.Printf("sizeof interface{} = %d\n", unsafe.Sizeof(i1))
fmt.Printf("i1 %x %+v\n", i1, asInterfaceStructure(i1))
fmt.Printf("i2 %x %+v\n", i2, asInterfaceStructure(i2))
var nilInterface interface{}
fmt.Printf("nil interface = %+v\n", asInterfaceStructure(nilInterface))
}
sizeof interface{} = 16
i1 aaaaaaaaaaaaaaa {pt:5328736 pv:825741282816}
i2 bbbbbbbbbbbbbbb {pt:5328736 pv:825741282824}
nil interface = {pt:0 pv:0}
func TestAssignInterfaceNil(t *testing.T) {
var p *int = nil
var i interface{} = p
fmt.Printf("%v %+v is nil %v\n", i, asInterfaceStructure(i), i == nil)
}
<nil> {pt:5300576 pv:0} is nil false
var storageEngine StorageEngine // 这是一个全局变量
redis := OpenRedis(cfg.Url, dbindex)
if redis != nil {
// 连接成功
storageEngine = redis // 确定redis不是nil之后再赋值给interface变量
} else {
// 连接失败
...
}
// OpenRedis opens redis as entity storage
func OpenRedis(url string, dbindex int) EntityStorage {
c, err := redis.DialURL(url)
if err != nil {
return nil
}
if dbindex >= 0 {
if _, err := c.Do("SELECT", dbindex); err != nil {
return nil
}
}
es := &redisEntityStorage{
c: c,
}
return es
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有