Serialisasi dan deserialisasi jenis fungsi golang

王林
Lepaskan: 2024-04-29 08:15:02
asal
841 orang telah melayarinya

Jenis fungsi GoLang boleh disiri dan dinyahsiri melalui pakej pengekodan/gob. Pensirian: Daftar jenis tersuai dan gunakan gob.NewEncoder untuk mengekod jenis fungsi ke dalam tatasusunan bait. Penyahserialisasian: Gunakan gob.NewDecoder untuk menyahsiri jenis fungsi daripada tatasusunan bait. . Walau bagaimanapun, penjagaan khas diperlukan apabila mensiri jenis fungsi kepada data binari atau menyahsirikannya semula ke dalam fungsi. Artikel ini akan memperkenalkan cara melaksanakan bersiri dan penyahserikatan jenis fungsi dengan berkesan dan memberikan contoh praktikal.

Serialisasi dan deserialisasi jenis fungsi golangSerialization

Untuk mensirikan jenis fungsi, kita perlu menggunakan pakej encoding/gob. Pakej ini menyediakan fungsi Daftar, yang membolehkan kami mendaftar jenis tersuai untuk pengekodan dan penyahkodan.

import (
    "bytes"
    "encoding/gob"
)

// 自定义类型,包含一个函数类型的字段
type MyType struct {
    Func func(int) int
}

// 注册 MyType 以便进行编码和解码
func init() {
    gob.Register(MyType{})
}

// 将 MyType 实例序列化为字节数组
func SerializeFunction(m MyType) ([]byte, error) {
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)
    if err := enc.Encode(m); err != nil {
        return nil, err
    }
    return buf.Bytes(), nil
}
Salin selepas log masuk

Deserialisasi

Untuk menyahsiri jenis fungsi daripada tatasusunan bait kembali kepada fungsi, kami menggunakan fungsi Decode daripada pakej encoding/gob.

// 从字节数组反序列化 MyType 实例
func DeserializeFunction(data []byte) (*MyType, error) {
    var m MyType
    dec := gob.NewDecoder(bytes.NewReader(data))
    if err := dec.Decode(&m); err != nil {
        return nil, err
    }
    return &m, nil
}
Salin selepas log masuk

Kes praktikal

Berikut ialah kes praktikal yang menunjukkan cara mensiri dan menyahsiri jenis fungsi dalam GoLang:

// 定义一个函数类型
type Op func(int) int

// 序列化一个函数类型
func SerializeOp(op Op) ([]byte, error) {
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)
    if err := enc.Encode(MyType{Func: op}); err != nil {
        return nil, err
    }
    return buf.Bytes(), nil
}

// 反序列化一个函数类型
func DeserializeOp(data []byte) (Op, error) {
    var m MyType
    dec := gob.NewDecoder(bytes.NewReader(data))
    if err := dec.Decode(&m); err != nil {
        return nil, err
    }
    return m.Func, nil
}

// 主函数
func main() {
    // 创建一个函数类型
    add := func(x int) int { return x + 1 }

    // 序列化函数类型
    data, err := SerializeOp(add)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 反序列化函数类型
    deserializedOp, err := DeserializeOp(data)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 使用反序列化的函数类型
    result := deserializedOp(10)
    fmt.Println(result) // 输出:11
}
Salin selepas log masuk

Atas ialah kandungan terperinci Serialisasi dan deserialisasi jenis fungsi golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan