Есть задача записать в бинарный файл набор чисел типа float.
Вроде как, самый правильный способ с контролем порядка байт и прочего это такой:
d := make([]float32, vectorDataLen)
for x := 0; x < len(d); x++ {
d[x] = float32(x)
}
var bin_buf bytes.Buffer
binary.Write(&bin_buf, binary.LittleEndian, d)
n, err := dat_file.Write(bin_buf.Bytes())
Но в этом случае данные копируются лишний раз и память перевыделяется, что тоже, как кажется, неоптимально.
Попробовал поиграться с встроенным пакетом unsafe:const SZ = 1000
func test_unsafePointer() {
d := make([]int, SZ)
for x := 0; x < len(d); x++ {
d[x] = x
}
p1 := (unsafe.Pointer(&d[0]))
b := *(*[SZ * unsafe.Sizeof(d[0])]byte)(p1)
p2 := (unsafe.Pointer(&b[0]))
s := b[:]
p3 := (unsafe.Pointer(&s[0]))
println("len(d)= ", len(d))
println("len(b)= ", len(b))
println("len(s)= ", len(s))
s = append(s, s...)
p4 := (unsafe.Pointer(&s[0]))
println("len(s+)= ", len(s))
println("pointers = ", p1, " ", p2, " ", p3, " ", p4)
}
len(d)= 1000
len(b)= 8000
len(s)= 8000
len(s+)= 16000
pointers = 0xc00006c030 0xc00006a0f0 0xc00006a0f0 0xc000072000
Получатся, что массив "переносится" в слайс без копирования, и с сохранением функционала последнего (p2==p3), что логично при дополнении слайса память под него перевыделяется: p4 уже не равен p3
А вот как бороться с перевыделением d->b ? p1 != p2