Нужно больше ввода или информации относительно двоичного. Ошибка записи неверный тип ххх - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь записать protobuf * Timestamp.timestamp в двоичный файл, и я получил ошибку invalid type *Timestamp.timestamp, и я пытался безрезультатно, кто-нибудь может указать мне направление?спасибо!

    package main

    import (
        "bytes"
        "encoding/binary"
        "fmt"
        google_protobuf "github.com/golang/protobuf/ptypes/timestamp"
        "time"
    )

    func main() {
        buff := new(bytes.Buffer)

        ts := &google_protobuf.Timestamp{
            Seconds: time.Now().Unix(),
            Nanos:   0,
        }

        err := binary.Write(buff, binary.LittleEndian, ts)

        if err != nil {
            panic(err)
        }
        fmt.Println("done")
    }

1 Ответ

0 голосов
/ 04 марта 2019

Кто-нибудь может указать мне какое-то направление?


Прочитать сообщение об ошибке.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...