面试题答案
一键面试package main
import (
"encoding/json"
"fmt"
)
// 定义接口TypeA
type TypeA interface {
Do()
}
// 实现TypeA接口的结构体
type ImplTypeA struct{}
func (i *ImplTypeA) Do() {
fmt.Println("ImplTypeA Do method")
}
// Inner结构体
type Inner struct {
A TypeA `json:"a"`
}
// Outer结构体
type Outer struct {
InnerList []Inner `json:"inner_list"`
}
// 序列化函数
func Serialize(outer *Outer) (string, error) {
data, err := json.MarshalIndent(outer, "", " ")
if err != nil {
return "", err
}
return string(data), nil
}
// 反序列化函数
func Deserialize(jsonStr string) (*Outer, error) {
var outer Outer
err := json.Unmarshal([]byte(jsonStr), &outer)
if err != nil {
return nil, err
}
// 检查接口实现类型是否匹配
for _, inner := range outer.InnerList {
if _, ok := inner.A.(*ImplTypeA);!ok {
return nil, fmt.Errorf("interface implementation type mismatch")
}
}
return &outer, nil
}
你可以这样调用这些函数:
func main() {
// 创建实例
outer := Outer{
InnerList: []Inner{
{A: &ImplTypeA{}},
},
}
// 序列化
jsonStr, err := Serialize(&outer)
if err != nil {
fmt.Println("Serialize error:", err)
return
}
fmt.Println("Serialized JSON:", jsonStr)
// 反序列化
deserializedOuter, err := Deserialize(jsonStr)
if err != nil {
fmt.Println("Deserialize error:", err)
return
}
fmt.Println("Deserialized Outer:", deserializedOuter)
}
- 接口定义:首先定义了
TypeA
接口,它有一个Do
方法。 - 结构体定义:定义了
ImplTypeA
结构体来实现TypeA
接口。同时定义了Inner
结构体和Outer
结构体,并给它们的字段加上了自定义的json
标签。 - 序列化函数:
Serialize
函数使用json.MarshalIndent
将Outer
结构体序列化为格式化的JSON字符串。 - 反序列化函数:
Deserialize
函数使用json.Unmarshal
将JSON字符串反序列化为Outer
结构体。并且在反序列化后检查接口实现类型是否匹配,如果不匹配则返回错误。 - 主函数:在
main
函数中,创建了一个Outer
结构体实例,调用序列化和反序列化函数,并处理可能出现的错误。