实例说明:
(1)一个Monster结构体,字段Name,Age,Skill
(2)Monster有一个Store方法,可以将一个Monster对象序列化后保存在文件中;
(3)Monster有一个ReStore方法,可以从文件中读取数据并且反序列化;
(4)编译测试用例文件store_test.go,填写测试用例函数TestStore和TestReStore进行测试;
目录结构:
main.go
package main import ( "bufio" "encoding/json" "fmt" "io" "os" ) type monster struct { Name string `json:"name"` Age int `json:"age"` Skill string `json:"skill"` } func (m *monster) store() []byte { data, err := json.Marshal(&m) if err != nil { fmt.Printf("序列化错误,error=%v", err) } return data } func (m *monster) reStore(data string) monster { err := json.Unmarshal([]byte(data), &m) if err != nil { fmt.Printf("反序列化错误,error=%v", err) } return *m } func writeFile(data string, path string) { file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { fmt.Println("写入到文件中错误,error=", err) } defer file.Close() writer := bufio.NewWriter(file) writer.WriteString(data) writer.Flush() } func readFile(path string) string { var str string var e error file, err := os.OpenFile(path, os.O_RDONLY, 0666) if err != nil { fmt.Println("写入到文件中错误,error=", err) } defer file.Close() reader := bufio.NewReader(file) for { str, e = reader.ReadString(' ') if e == io.EOF { break } //如果要返回多个数据的话,可以在这里定义一个切片进行接收每一行的str,最后返回这个切片即可 } //这里实际上返回的是最后一行数据 return str } func main() { m := monster{ Name: "孙悟空", Age: 200, Skill: "七十二变", } data := m.store() fmt.Println(string(data)) // writeFile(string(data), "test.txt") str := readFile("test.txt") var mon monster mon = m.reStore(str) fmt.Println(mon) }
main_test.go
package main import ( "fmt" "testing" ) func TestStore(t *testing.T) { m := &monster{ Name: "孙悟空", Age: 200, Skill: "七十二变", } data := m.store() if string(data) == "" { t.Fatal("序列化失败") } t.Logf("序列化成功") } func TestReStore(t *testing.T) { var m monster str := "{"name":"孙悟空","age":200,"skill":"七十二变"}" data := m.reStore(str) fmt.Println(data) t.Logf("反序列化成功") } func TestWriteFile(t *testing.T) { m := &monster{ Name: "孙悟空", Age: 200, Skill: "七十二变", } data := m.store() writeFile(string(data), "test.txt") t.Log("存储成功") } func TestReadFile(t *testing.T) { data := readFile("test.txt") if data == "" { t.Fatal("读取失败") } t.Log("读取成功") }