MST

星途 面试题库

面试题:Go中xml包如何处理嵌套结构体数据

假设有一个包含嵌套结构体的复杂数据结构,如订单结构体,订单包含客户信息和多个订单项,每个订单项又有商品信息等。请使用Go的encoding/xml包将这样的结构体编码为XML格式,并展示如何解码回来。
13.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "encoding/xml"
    "fmt"
)

// 定义商品结构体
type Product struct {
    XMLName xml.Name `xml:"product"`
    Name    string   `xml:"name"`
    Price   float32  `xml:"price"`
}

// 定义订单项结构体
type OrderItem struct {
    XMLName xml.Name `xml:"order_item"`
    Product Product  `xml:"product"`
    Quantity int      `xml:"quantity"`
}

// 定义客户结构体
type Customer struct {
    XMLName xml.Name `xml:"customer"`
    Name    string   `xml:"name"`
    Address string   `xml:"address"`
}

// 定义订单结构体
type Order struct {
    XMLName   xml.Name   `xml:"order"`
    Customer  Customer   `xml:"customer"`
    OrderItems []OrderItem `xml:"order_items>order_item"`
}

// 编码函数
func EncodeToXML(order Order) ([]byte, error) {
    xmlData, err := xml.MarshalIndent(order, "", "  ")
    if err != nil {
        return nil, err
    }
    return append([]byte(xml.Header), xmlData...), nil
}

// 解码函数
func DecodeFromXML(xmlData []byte) (Order, error) {
    var order Order
    err := xml.Unmarshal(xmlData, &order)
    if err != nil {
        return Order{}, err
    }
    return order, nil
}

你可以使用以下方式调用这些函数:

func main() {
    // 初始化订单数据
    order := Order{
        Customer: Customer{
            Name:    "John Doe",
            Address: "123 Main St",
        },
        OrderItems: []OrderItem{
            {
                Product: Product{
                    Name:  "Laptop",
                    Price: 1000.00,
                },
                Quantity: 1,
            },
            {
                Product: Product{
                    Name:  "Mouse",
                    Price: 50.00,
                },
                Quantity: 2,
            },
        },
    }

    // 编码为XML
    xmlData, err := EncodeToXML(order)
    if err != nil {
        fmt.Printf("编码错误: %v\n", err)
        return
    }
    fmt.Println(string(xmlData))

    // 解码XML
    decodedOrder, err := DecodeFromXML(xmlData)
    if err != nil {
        fmt.Printf("解码错误: %v\n", err)
        return
    }
    fmt.Printf("解码后的订单: %+v\n", decodedOrder)
}