四时宝库

程序员的知识宝库

关于go语言数据字节化凸现指针的优势

#程序# #程序员# #go# #c# #cplusplus# #cpp# 通过下面这个例子,可以了解go语言如何使用指针,我也认为这段代码是学习如何使用指针的精华。

最早我需要写一个STRUCT到二进制文件中,网上看到这样一个例子。

    data := int64(n)
    bytebuf := bytes.NewBuffer([]byte{})
    binary.Write(bytebuf, binary.BigEndian, data)
    return bytebuf.Bytes()

可以把int64看着是一个struct,一样可以将struct的bytebuf写到文件中。

我觉得这样不妥,原因很简单,进行了内存copy,若处理的内容较大,效率很低,如一个很大的数组,这种copy效率是很低的,浪费内存。

应该像C语言一样,使用指针,直接转换为byte(char、uchar)。

通过研究go bytes的构成,直接使用类的方法,将成员byte,我写了这样一个结构:

// StockHolded 持仓情况

type StockHolded struct {
    Date         int32   //交易日期
    YesHolded    int32   //昨天持仓
    PreHolded    int32   //交易前持仓
    Holded       int32   //交易后持仓
    PermitReduce int32   //当天剩余可以卖出数量(最多是昨天的持仓数)
    Price        float32 //交易价格
}

然后定义了这样一个方法:

func (t *StockHolded) sizeof() int {
	return int(unsafe.Sizeof(*t))
}

func (t *StockHolded) toByte() []byte {
	var x reflect.SliceHeader
	x.Len = t.sizeof()
	x.Cap = t.sizeof()
	x.Data = uintptr(unsafe.Pointer(t))
	return *(*[]byte)(unsafe.Pointer(&x))
}

当你调用StockHolded的实例,直接调用toByte()成员函数,就可以获得这个结构的内存bytes。

如果是数组或切片,则x的Len和Cap是单个struct的sizeof()*数组或切片的个数,x.Data取[0]的地址,就可以生成数组的bytes。

从这里可以看出,通过指针转换,效率是很高的吧。

下次我再讲讲golang语言的反射。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接