Saya perlu mendefinisikan fungsi Send/Receive menggunakan paket gob.

Saya mendefinisikan Send() hanya sebagai berikut:

func Send(enc *gob.Encoder, PKG interface{}) error {
    err := enc.Encode(PKG)
    return err
}

Dan Receive sebagai berikut:

func Receive(dec *gob.Decoder) (PKG interface{}) {

    err := dec.Decode(PKG)

    if err != nil {
        fmt.Println(PKG)
        Errors.Error(err, "Error receiving Package")
    }
    if PKG == nil {

        fmt.Println(PKG)
        Errors.Error(err, "Receiving empty Package")
    }
    return PKG
}

Saya menggunakan fungsi-fungsi ini dengan berbagai tipe: struct, tipe konkret, sedikit pun... Saya gunakan untuk memeriksa tipe yang diterima tepat setelah memanggil metode Receive.

Namun, sayangnya, saya tidak mencapai titik henti pemeriksaan. Metode ini (Send/Receive) salah didefinisikan. Saya mendapatkan pointer <nil> (panic: Receiving empty Package) di sisi penerima meskipun semua item terkirim diekspor.

Saat ini, saya mencoba mengirim int dari jenis yang ditentukan berikut:

type ProcessType int

const (
    COORDINATOR ProcessType = iota
    SENDER
    NORMALPROCESS
)

Saya telah membaca banyak dokumentasi, tetapi tidak dapat memahami masalah ini secara menyeluruh. Bisakah Anda memberikan penjelasan yang rapi dan bersih.

0
Mohamad-Jaafar NEHME 5 April 2021, 08:11

1 menjawab

Jawaban Terbaik

Lewati &PKG untuk menyandikan dan mendekode:

func Send(enc *gob.Encoder, PKG interface{}) error {
    // Pass &PKG to force encoder to send PKG as a dynamic value.
    err := enc.Encode(&PKG)
    return err
}

func Receive(dec *gob.Decoder) (PKG interface{}) {
    // Pass address of result.
    err := dec.Decode(&PKG)
    if err != nil {
        fmt.Println(PKG)
        log.Fatal(err, "Error receiving Package")
    }
    if PKG == nil {
        fmt.Println(PKG)
        log.Fatal(err, "Receiving empty Package")
    }
    return PKG
}

Sisi dekode harus gob.Register nilai dari semua jenis yang mungkin diteruskan ke Kirim. Gunakan kode ini untuk contoh iota:

gob.Register(COORDINATOR) // any value of type ProcessType works.

Jalankan kode di Playground.

0
ThinkGoodly 5 April 2021, 06:06