MST

星途 面试题库

面试题:Go中反射在简单结构体序列化中的应用

假设有一个简单的Go结构体如下:type User struct { Name string `json:"name"` Age int `json:"age"` } 请使用Go反射实现将该结构体实例序列化为类似JSON格式的字符串(键值对形式,冒号分隔,逗号间隔,花括号包裹),不使用标准库中的json包。
26.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func serializeToJsonLike(user interface{}) string {
    value := reflect.ValueOf(user)
    if value.Kind() != reflect.Struct {
        panic("input must be a struct")
    }

    result := "{"
    for i := 0; i < value.NumField(); i++ {
        field := value.Type().Field(i)
        tag := field.Tag.Get("json")
        if tag == "" {
            tag = field.Name
        }
        result += fmt.Sprintf("\"%s\":\"%v\"", tag, value.Field(i).Interface())
        if i < value.NumField()-1 {
            result += ","
        }
    }
    result += "}"
    return result
}

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

func main() {
    u := User{Name: "John", Age: 30}
    fmt.Println(serializeToJsonLike(u))
}

代码解释

  1. serializeToJsonLike 函数
    • 使用 reflect.ValueOf 获取传入结构体的 reflect.Value
    • 检查传入值是否为结构体,如果不是则 panic
    • 遍历结构体的每个字段,通过 field.Tag.Get("json") 获取 json 标签值,如果标签值为空,则使用字段名。
    • 构建类似 JSON 格式的字符串,每个键值对之间用逗号分隔,最后用花括号包裹。
  2. main 函数
    • 创建一个 User 结构体实例。
    • 调用 serializeToJsonLike 函数并打印结果。