您的位置 首页 golang

关于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语言的反射。

文章来源:智云一二三科技

文章标题:关于go语言数据字节化凸现指针的优势

文章地址:https://www.zhihuclub.com/101295.shtml

关于作者: 智云科技

热门文章

网站地图