题目如下
读取文件,文件格式如下(自行增加内容到10行以上):
书名:Docker容器与容器云;单价:48.88;出版社:人民邮电出版社;ID:91y81b4flc340134;作者:浙江大学SEL实验室
书名:华为人力资源管理;单价:26.7;出版社:古吴轩出版社;ID:91y81b4519340134;作者:黄志伟
书名:python基础教程;单价:63.3;出版社:人民邮电出版社;ID:91y8115419340134;作者:Magnas Lie
读取文件后,提供rest接口,可以让用户通过以下接口查询信息:
1、查询指定书名的书籍的相关信息;
2、查询指定出版社出版的所有书籍名称;
3、查询指定作者编写的所有书籍名称;
要求:
1、使用gin作为框架,提供http服务
2、所有接口的返回信息在body中以json形式呈现
考察点:
1、文件的读取操作
2、http服务和gin的使用
3、json序列化
代码
package main
import (
"bufio"
"encoding/json"
"fmt"
"io"
"os"
//"net/http"
//"fmt"
"github.com/gin-gonic/gin"
"net/http"
"strings"
)
//定义一个书类
type bookInfo1 struct {
Name string
Price string
Press string
Id string
Author string
}
//定义一个全局变量用来储存书籍信息===数据库
var c = make([]bookInfo1,0,1000)
//对文件进行基本的读取操作
func readFile() {
file, err := os.Open("./book")
if err != nil {
fmt.Printf("open file err=%v", err)
}
//fmt.Printf()
//函数退出时关闭句柄关闭文件,否则会产生内存泄漏
defer file.Close()
//创建一个 *Reader 带缓冲
reader := bufio.NewReader(file)
//循环读文件
for {
str, err := reader.ReadString('\n')
if err == io.EOF {
break
}
//转化为结构体
c=append(c,toStruct(str))
}
fmt.Println("===================基本文件读取结束==========")
}
//将读取的信息转化为bookInfo1类型
func toStruct(string2 string) bookInfo1{
//首先分割掉分号
a00 :=strings.Split(string2,";") //a1 的类型是切片
//fmt.Println(a00)
//将切片转化成字符串
s:=make(map[string]string)
for _,v := range a00{
a01 := strings.Split(string(v), ":")
//fmt.Println(a01)
s[a01[0]] = a01[1]
}
//结构体实例化
b:=bookInfo1{Id: s["ID"],Name: s["书名"],Press: s["出版社"],Author: s["作者"],Price: s["单价"]}
//test
//fmt.Println(s)
//fmt.Println(b)
return b
}
//定义一个json序列化函数
func toJson(input bookInfo1 ) string {
b, err := json.MarshalIndent(input,""," ")
if err != nil {
fmt.Println("json err:", err)
}
//fmt.Println(string(b))
t := string(b)
return t
}
//通过书名进行查询
func byName(nameFind string) bookInfo1{
var out bookInfo1
//var t string //定义返回结果
for i:=0; i<len(c);i++{
if c[i].Name == nameFind{
out = c[i] //将切片的查询结果赋值给out,实例化
}
}
if out.Name == "" { // 这个判断条件其实有一点点问题
fmt.Println("找不到该书")
}else{
//t = toJson(out)
}
return out //这里是假设了该书名的书只有一本
}
type Struct1 struct {
id int
data bookInfo1
}
//以出版社为键进行查找
func pressAll(pressName string) []Struct1 {
var out Struct1
var out1 =make([]Struct1,0,50)
//var tt press_All
//var t string
for i:=0; i<len(c);i++{
if c[i].Press == pressName{
out.id = i
out.data= c[i] //将切片的查询结果赋值给out,实例化
//fmt.Println(out)
out1 = append(out1,out)
}
}
if len(out1) == 0 { // 这个判断条件其实有一点点问题
fmt.Println("找不到该出版社")
}//else{
//var outJson = make([]string,0,50)
//for _,v := range out1{
//
// outJson = append(outJson,toJson(v)) //将多条书籍结构体数据转化为json格式再存储到切片中
//}
//fmt.Println(outJson)
//}
return out1 //返回某出版社的书
}
type Struct2 struct {
id int
data string
}
//查询指定作者的书
func authorWork(authorName string) []Struct2{
//fmt.Println(authorName)
var out Struct2
var out1 = make([]Struct2,0,50)
//var tt string //定义返回结果
for i:=0; i<len(c);i++{
//fmt.Println(c[i].Author)
if strings.TrimSpace(c[i].Author) == authorName{ //这里注意有空格存在
out.id = i
out.data = c[i].Name
out1 = append(out1,out)
}
}
//bytes, e := json.Marshal(out)
//if e != nil {
// fmt.Println("序列化失败")
//} else {
// tt = string(bytes)
//
// //fmt.Println(tt)
//}
return out1 //返回指定作者的所有书目
}
func x1(c *gin.Context) {
data := byName("python基础教程")
fmt.Println(data)
c.JSON(http.StatusOK,data)
}
func x2(c *gin.Context) {
data := pressAll("人民邮电出版社")
//c.JSON(http.StatusOK,(data[1]).data)
//fmt.Println(data[1])
for i:=0;i<len(data);i++{
c.JSON(http.StatusOK,data[i].data)
}
}
func x3(c *gin.Context) {
data := authorWork("黄志伟")
//fmt.Println(data[1])
//c.String(200,data)
for i:=0;i<len(data);i++{
c.JSON(http.StatusOK, data[i].data)
}
}
func main() {
readFile()
//fmt.Println(c)
r:=gin.Default() //返回默认的路由引擎
//指定用户使用get请求
r.GET("/byName",x1)
r.GET("/byPress",x2)
r.GET("/byAuthor",x3)
r.Run(":9090")
}
最后可以在postman中进行查询操作