#程序# #程序员# #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语言的反射。