go面试

3 篇文章 0 订阅
2 篇文章 0 订阅

题目如下

读取文件,文件格式如下(自行增加内容到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中进行查询操作
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值