用go语言实现温度记录功能(实验)

本文介绍了一个使用Go语言进行JSON文件操作的简单程序,包括创建、添加和查询JSON文件等功能。通过命令行输入不同的指令来完成对JSON文件的管理。

1. 实验需求

在这里插入图片描述
在这里插入图片描述
这里我主要侧重对编码实现的记录。

2. 编码实现

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"io"
	"os"
	"strconv"
	"strings"
)

type Pin struct {
	Field1 int `json:"2"`
	Field2 int `json:"3"`
}

type DIdata struct {
	Temperature int    `json:"温度"`
	Humidity    int    `json:"湿度"`
	Date        string `json:"日期"`
	Pin         Pin    `json:"引脚"`
}

type ResDate struct {
	DIdata DIdata `json:"DIdata"`
}

func main() {
	for {
		fmt.Println("请输入命令:")
		work()
		fmt.Println()

	}
}
func work() {

	var input string

	reader := bufio.NewReader(os.Stdin)
	input, err := reader.ReadString('\n') //读取一行输入
	if err != nil {
		fmt.Println("出现错误,请重试", err)
		return
	}
	input = strings.TrimSuffix(input, "\r\n") //去掉换行符

	split := strings.Split(input, " ")

	keyWord := split[0]

	//fmt.Printf("%#v\n",)

	if keyWord == "creatf" { //创建json文件
		content := strings.Trim(input, keyWord+" ") //命令后的内容
		//json反序列化
		var objContent ResDate
		err = json.Unmarshal([]byte(content), &objContent)
		if err != nil {
			fmt.Println("输入错误。")
			panic(err)
		}

		replace := strings.Replace(objContent.DIdata.Date, "/", "-", -1)
		//fmt.Println(replace)   //日期分隔符格式转化
		mkFile(replace, content)

	} else if keyWord == "addjson" { //在指定json文件中添加数据

		content := strings.Trim(input, keyWord+" "+split[1]+" ") //命令后的内容
		//json反序列化
		var objContent ResDate
		err = json.Unmarshal([]byte(content), &objContent)
		if err != nil {
			fmt.Println("输入错误。")
			panic(err)
		}

		addFile(split[1], content)
	} else if keyWord == "findjson" { //在指定json文件中查找数据

		key := split[1]
		fileName := split[3]
		findFile(fileName, key)

		//fmt.Println("find")

	} else {
		fmt.Println("输入不合法请重新输入,注意命令前不要添加空格。")
	}

	//fmt.Println(input)

	//split := strings.Split(input, " ")
	//
	//fmt.Println(split[0])
	//fmt.Println(input)

	//marshal, _ := json.Marshal(request)

	//fmt.Println(string(marshal))
	//fmt.Println(request)

	//fmt.Println()

}


/**
fileName 文件名称
key 关键词
*/
func findFile(fileName string, key string) {
	// 向标准输出写入内容
	var fileObj = &os.File{}
	_, err := os.Stat("./" + fileName)
	if err != nil { //如果文件不存在
		fmt.Println("文件:" + fileName + "不存在")
		return
	}
	fileObj, _ = os.OpenFile("./"+fileName, os.O_CREATE|os.O_RDONLY|os.O_APPEND, 0666)
	defer fileObj.Close()

	//读取数据
	//var data = make([]byte, 100)
	reader := bufio.NewReader(fileObj)

	for {
		line, _, err := reader.ReadLine()
		if err == io.EOF {
			break
		}
		if err != nil {
			return
		}
		//for i := 0; i < len(line); i++ {
		//	data = append(data, line[i])
		//}
		if strings.Contains(string(line), key) {
			fmt.Println(string(line))
		}
	}
	fmt.Println("已经展示文件:" + fileName + "中所有\"时间\"为\"" + key + "\"的数据")

	//var objContent ResDate

	//json.Unmarshal(data, &objContent)
	//println(data)
	//println(string(data))
}

/**
fileName 文件名称
content 添加内容
*/
func addFile(fileName string, content string) {
	// 向标准输出写入内容
	var fileObj = &os.File{}
	_, err := os.Stat("./" + fileName)
	if err != nil { //如果文件不存在
		fmt.Println("文件:" + fileName + "不存在")
	}
	fileObj, _ = os.OpenFile("./"+fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	defer fileObj.Close()

	// 获取writer对象
	writer := bufio.NewWriter(fileObj)
	writer.WriteString(content + "\n")
	// 刷新缓冲区,强制写出
	writer.Flush()
	fmt.Println("增加数据成功," + content)

}

/**
fileName 文件名称
content 添加内容
*/
func mkFile(fileName string, content string) {
	// 向标准输出写入内容
	fileName = fileName + "h"
	var fileObj = &os.File{}
	for i := 1; i < 999; i++ {
		_, err := os.Stat("./" + fileName + strconv.Itoa(i) + ".json")
		if err == nil { //如果文件存在
			fmt.Println("文件: " + fileName + strconv.Itoa(i) + ".json " + "已存在")
			continue
		}
		fileObj, _ = os.OpenFile("./"+fileName+strconv.Itoa(i)+".json", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
		defer fileObj.Close()
		// 获取writer对象
		writer := bufio.NewWriter(fileObj)
		writer.WriteString(content + "\n")
		// 刷新缓冲区,强制写出
		writer.Flush()
		fmt.Println("文件创建成功,文件名: " + fileName + strconv.Itoa(i) + ".json ")
		break
	}

}

3. 参考资料

go中文文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值