面试题答案
一键面试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))
}
代码解释
serializeToJsonLike
函数:- 使用
reflect.ValueOf
获取传入结构体的reflect.Value
。 - 检查传入值是否为结构体,如果不是则
panic
。 - 遍历结构体的每个字段,通过
field.Tag.Get("json")
获取json
标签值,如果标签值为空,则使用字段名。 - 构建类似 JSON 格式的字符串,每个键值对之间用逗号分隔,最后用花括号包裹。
- 使用
main
函数:- 创建一个
User
结构体实例。 - 调用
serializeToJsonLike
函数并打印结果。
- 创建一个