Кто-нибудь может указать мне какое-то направление?
Прочитать сообщение об ошибке.
binary.Write: invalid type *timestamp.Timestamp
Читатьдокументация для binary.Write
и timestamp.Timestamp
.
Двоичный пакет
import "encoding/binary"
func Write
func Write(w io.Writer, order ByteOrder, data interface{}) error
Write записывает двоичное представление данных в w.Данные должны быть значением фиксированного размера или фрагментом значений фиксированного размера или указателем на такие данные.Логические значения кодируются одним байтом: 1 для истины и 0 для ложных.Байты, записанные в w, кодируются с использованием указанного порядка байтов и считываются из последовательных полей данных.При написании структур нулевые значения записываются для полей с пустыми (_) именами полей.
отметка времени пакета
import "github.com/golang/protobuf/ptypes/timestamp"
отметка времени типа
type Timestamp struct {
// Represents seconds of UTC time since Unix epoch
// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
// 9999-12-31T23:59:59Z inclusive.
Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"`
// Non-negative fractions of a second at nanosecond resolution. Negative
// second values with fractions must still have non-negative nanos values
// that count forward in time. Must be from 0 to 999,999,999
// inclusive.
Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
Метка времени представляет собой момент времени, независимый от любого часового пояса или календаря, представленный в виде секунд и долей секунд с наносекундным разрешением во время UTC Epoch.Он закодирован с использованием Proleptic Gregorian Calendar, который расширяет григорианский календарь до первого года.Он кодируется в предположении, что длительность всех минут составляет 60 секунд, т. Е. Високосные секунды «размазаны», поэтому для интерпретации не требуется таблица високосных секунд.Диапазон значений от 0001-01-01T00: 00: 00Z до 9999-12-31T23: 59: 59.999999999Z.Ограничивая этот диапазон, мы гарантируем, что мы можем конвертировать строки даты в RFC 3339 и обратно.См. https://www.ietf.org/rfc/rfc3339.txt.
Как говорится в сообщении об ошибке: *timestamp.Timestamp
не является значением фиксированного размера или фрагментом значений фиксированного размера или указателем на такие данные.
Чтобы подтвердить это, закомментируйте поле XXX_unrecognized
переменного размера;ошибки нет.
package main
import (
"bytes"
"encoding/binary"
"fmt"
"time"
)
// https://github.com/golang/protobuf/blob/master/ptypes/timestamp/timestamp.pb.go
type Timestamp struct {
// Represents seconds of UTC time since Unix epoch
// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
// 9999-12-31T23:59:59Z inclusive.
Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"`
// Non-negative fractions of a second at nanosecond resolution. Negative
// second values with fractions must still have non-negative nanos values
// that count forward in time. Must be from 0 to 999,999,999
// inclusive.
Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
// XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func main() {
buff := new(bytes.Buffer)
ts := &Timestamp{
Seconds: time.Now().Unix(),
Nanos: 0,
}
err := binary.Write(buff, binary.LittleEndian, ts)
if err != nil {
panic(err)
}
fmt.Println("done")
}
Детская площадка: https://play.golang.org/p/Q5NGnO49Dsc
Выход:
done