Go语言序列化与信号处理

33、使用 encoding/gob 包对 Go 语言的映射(map)以及结构体切片进行序列化和反序列化操作。

以下是一个使用 encoding/gob 包对 Go 语言的映射( map )以及结构体切片进行序列化和反序列化操作的示例代码:

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
)

// 定义一个结构体
type Person struct {
    Name string
    Age  int
}

func main() {
    // 初始化一个 map 和一个结构体切片
    personMap := map[string]Person{
        "Alice": {Name: "Alice", Age: 25},
        "Bob":   {Name: "Bob", Age: 30},
    }
    personSlice := []Person{
        {Name: "Charlie", Age: 35},
        {Name: "David", Age: 40},
    }

    // 序列化 map
    var mapBuffer bytes.Buffer
    mapEncoder := gob.NewEncoder(&mapBuffer)
    err := mapEncoder.Encode(personMap)
    if err != nil {
        fmt.Println("序列化 map 出错:", err)
        return
    }

    // 反序列化 map
    var decodedMap map[string]Person
    mapDecoder := gob.NewDecoder(&mapBuffer)
    err = mapDecoder.Decode(&decodedMap)
    if err != nil {
        fmt.Println("反序列化 map 出错:", err)
        return
    }
    fmt.Println("反序列化后的 map:", decodedMap)

    // 序列化结构体切片
    var sliceBuffer bytes.Buffer
    sliceEncoder := gob.NewEncoder(&sliceBuffer)
    err = sliceEncoder.Encode(personSlice)
    if err != nil {
        fmt.Println("序列化结构体切片出错:", err)
        return
    }

    // 反序列化结构体切片
    var decodedSlice []Person
    sliceDecoder := gob.NewDecoder(&sliceBuffer)
    err = sliceDecoder.Decode(&decodedSlice)
    if err != nil {
        fmt.Println("反序列化结构体切片出错:", err)
        return
    }
    fmt.Println("反序列化后的结构体切片:", decodedSlice)
}

在上述代码中,首先定义了一个 Person 结构体。在 main 函数中,初始化了一个 map 和一个结构体切片。然后分别对 map 和结构体切片进行序列化和反序列化操作,并将反序列化后的结果打印输出。

34、创建一个Go程序,处理你选择的任意三个信号。

以下是一个示例Go程序,用于处理SIGINT、SIGTERM和SIGHUP三个信号:

package main

import ( 
  "fmt" 
  "os" 
  "os/signal" 
  "syscall"
)

func handle(signal os.Signal) { 
  fmt.Println("Received signal:", signal)
}

func main() { 
  // 创建一个信号通道 
  sigs := make(chan os.Signal, 1) 

  // 监听SIGINT、SIGTERM和SIGHUP信号 
  signal.Notify(sigs, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP) 

  go func() { 
    // 从信号通道接收信号 
    sig := <-sigs 
    handle(sig) 
    os.Exit(0) 
  }()

  fmt.Println("Waiting for signals...") 

  // 保持程序运行 
  select {}
}

在这个程序中,我们首先创建了一个信号通道 sigs ,然后使用 signal.Notify 函数来监听SIGINT、SIGTERM和SIGHUP信号。接着,我们启动了一个goroutine来从信号通道接收信号,并调用 handle 函数来处理接收到的信号。最后,我们使用 select {} 来保持程序运行,直到接收到信号。

35、用Go语言创建一个实用程序,将文本文件中所有的制表符替换为程序命令行参数指定数量的空格。同样,输出将显示在屏幕上。

以下是一个实现该功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值