08 文件操作及JSON格式转换

文件操作

os.File 封装所有文件相关操作,File是一个结构体

访问文件
func Open (name string)(file *File ,err error)
打开一个文件用于后续操作,操作成功则返回文件对象,否则返回异常信息
fun (f *File) Close () error
关闭文件使文件不能读写, 返回可能出现错误。

func OpenFile(name string,flag int,perm fileMode)(file *File,err error)
打开文件函数,使用指定的选项、指定的模式打开指定的文件。
flag取值如下:
在这里插入图片描述
fileMode 参数取值:同linux文件权限控制,0666 表示 读写

func Copy(dst Writer,src Reader)(written int64,err error)
文件复制

读文件代码

func test01(){
	//打开文件
	file,err := os.Open("C:\\E\\goworks\\src\\go04\\file\\test01.txt")
	if err!= nil {
		fmt.Println("open file err",err)
		return
	}
	
	//fmt.Printf("file=v% \n",file)

	//读取文件内容
	reader := bufio.NewReader(file)
	for{
		str,err := reader.ReadString('\n')//读到一个换行就结束
		fmt.Println(str)
		if err == io.EOF{
			break
		}
		
	}

	err = file.Close()//关闭文件
	if err!= nil{
		fmt.Println("close file err",err)
		return 
	}
}

写文件代码

//文件写入
func test02(){
	//打开文件
	filePath :="C:\\E\\goworks\\src\\go04\\file\\test02.txt"
	file,err := os.OpenFile(filePath,os.O_WRONLY|os.O_CREATE,0666)

	if err!= nil {
		fmt.Println("open file err",err)
		return
	}
	defer file.Close()
	
	//fmt.Printf("file=v% \n",file)

	//读取文件内容
	writer := bufio.NewWriter(file)
	for i:=0;i<5;i++{
		writer.WriteString("nihao\n")
	}
	//writer 是写缓存,因此写完后必须调用Flush 方法,将缓存数据持久化
	writer.Flush()
}

文件复制

//文件复制
func CopyFile(dstFileName string,srcFileName string)(written int64,err error){
	srcFile,err:=os.Open(srcFileName)
	if(err != nil){
		fmt.Println("打开文件异常",err)
		return
	}
	//if()
	disFile,err:=os.OpenFile(dstFileName,os.O_WRONLY|os.O_CREATE,0666)
	if(err != nil){
		fmt.Println("打开文件异常",err)
		return
	}
	defer srcFile.Close()
	defer disFile.Close()
	reader := bufio.NewReader(srcFile)
	writer:=bufio.NewWriter(disFile)

	return io.Copy(writer,reader)

}

文件是否存在

//判断文件是否存在
func PathExists(path string)(bool,error){
	_,err := os.Stat(path)
	//如果os.Stat 方法未返回异常 则 表示目录存在
	if err==nil{
		return true,nil
	}
	//如果 返回了异常 判断 os.IsNotExist 返回true 
	//表示目录不存在
	
	if os.IsNotExist(err){
		return false,nil
	}
	//其他情况不确定是否存在
	return false,err
}

JSON格式转换

javascript Object notation 是一种轻量级的数据交换格式。目前已经成为主力的数据格式。json格式字符串与数据结构的相互转换时个语言的标准。

序列化:将符合条件的数据结构转换为JSON字符串
反序列化:反序列化是指 将json字符串转换为对应的数据结构
注意点

  1. 对于结构体的序列化,如果希望序列化后,字段的名字由我们重新定制,可以在结构体中定义tag标签。
    示例代码
func test05(){
	mon :=Monster{
		Name:"牛魔王",
		Age:100,
		Skill:"必杀技",
	}
	//序列化
	data,_:=json.Marshal(&mon)
	//{"Name":"牛魔王","MonsterAge":100,"Skill":"必杀技"}
	fmt.Println(string(data))

	//反序列化
	var a Monster ;
	json.Unmarshal(data,&a) 
	fmt.Println("struct反序列化结果:",a)


	//map 序列化
	map1 := map[string] interface{}{
		"name":"tom",
		"age":18,
		"skill":"bisha",
	}

	data,_ =json.Marshal(map1)
	fmt.Println(string(data))//{"age":18,"name":"tom","skill":"bisha"}
	
	//反序列化
	var b map[string] interface{}
	json.Unmarshal(data,&b) 
	fmt.Println("map反序列化结果:",b)
	
	//切片序列化
	var sli []map[string]interface{} 
	var m1 map[string]interface{}
	m1 = make(map[string]interface{})
	m1["name"]="tom"
	m1["age"]=19
	m1["skill"]="haha"
	sli=append(sli,m1)

	data,_ = json.Marshal(sli)
	//[{"age":19,"name":"tom","skill":"haha"}]
	fmt.Println(string(data))
	//反序列化
	var c []map[string]interface{} 
	json.Unmarshal(data,&c) 
	fmt.Println("map反序列化结果:",c)

	//基本类型序列化
	data,_ = json.Marshal(18)
	fmt.Println(string(data))//18
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catch that elf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值