实例说明:
(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('\n')
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("读取成功")
}