Go基础(8)-golang操作文件,json

该教程介绍了Go语言中对文件的基本操作,包括打开、关闭、读取和写入文件,以及带缓冲的读写。同时讲解了如何使用bufio进行文件读写,以及使用ioutil一次性读取小文件。此外,文章还涵盖了文件拷贝和判断文件是否存在。在JSON部分,文章讨论了结构体、map和切片的序列化与反序列化,并提到了结构体标签的使用。
摘要由CSDN通过智能技术生成

1,操作文件

1.1,文件流的介绍

在这里插入图片描述

1.2,打开文件和关闭文件

package main

import (
	"fmt"
	"os"
)

func main() {
	//打开文件
	file,err := os.Open("E:/go.txt")
	if(err!=nil){
		fmt.Println("open file err:",err)
	}
	//输出文件
	fmt.Printf("file=%v",&file)

	//关闭文件
	file.Close()
}

1.3,代缓冲带的reader读文件

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	file,err := os.Open("E:/go.txt")
	if(err!=nil){
		fmt.Println("open file err:",err)
	}
	defer file.Close()
	reader :=bufio.NewReader(file)
	for{
		str,err2:=reader.ReadString('\n')//读到一个换行就结束一次
		fmt.Println(str)
		if(err2 == io.EOF){//io.EOF表示文件的末尾
			break
		}
	}
	fmt.Println("文件读取完毕")
}

在这里插入图片描述

1.4,一次性读取文件

package main

import (
	"fmt"
	"io/ioutil"
)

//适用于文件不大的情况
func main() {
	file := "E:/go.txt"
	content,err := ioutil.ReadFile(file)
	if(err!=nil){
		fmt.Println("open file err:",err)
	}
	fmt.Printf("%v",string(content))
	//因为没有显示的Open也不需要显示的
	//因为文件的Open和Close被封装到ReadFile内部
}

在这里插入图片描述

1.5,写文件操作介绍

在这里插入图片描述

1.6,文件打开模式介绍

在这里插入图片描述

1.7,写文件案例

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	//创建一个新文件写入5句hello file
	filePath:="E:/go2.txt"
	file,err := os.OpenFile(filePath,os.O_WRONLY|os.O_CREATE|os.O_APPEND|os.O_TRUNC,0666)
	defer file.Close()
	if(err!=nil){
		fmt.Println("open file err:",err)
	}
	str := "hello file\n"
	writer := bufio.NewWriter(file)
	for i:=0;i<5 ;i++  {
		writer.WriteString(str)
	}
	//因为writer是带缓存的,需要flush写入文件
	writer.Flush()
}

在这里插入图片描述

1.8,拷贝文件并判断文件或者目录是否存在

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	filePath01:="E:/go2.txt"
	filePath02:="E:/go3.txt"
	data,err := ioutil.ReadFile(filePath01)
	if(err!=nil){
		fmt.Println("read file err %v",err)
	}
	//判断文件是否存在
	if(os.IsNotExist(err)){
		fmt.Printf(filePath01+"目录不存在")
	}
	err =ioutil.WriteFile(filePath02,data,0666)
}

在这里插入图片描述

1.9,拷贝图片

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func CopyFile(dstFileName string,srcFileName string)(written int64,err error){
	srcFile,err := os.Open(srcFileName)
	if(err!=nil){
		fmt.Println("OPEN srcFile ERR= %v\n",err)
	}
	reader := bufio.NewReader(srcFile)
	dstFile,err2 := os.OpenFile(dstFileName,os.O_WRONLY|os.O_CREATE|os.O_APPEND|os.O_TRUNC,0666)
	if(err2 != nil){
		fmt.Println("OPEN dstFile ERR= %v\n",err2)
	}
	writer:= bufio.NewWriter(dstFile)
	return io.Copy(writer,reader)
}
func main() {
	//那E:/1.png图片复制到E:/2.pn
	CopyFile("E:/2.png","E:/1.png")
}

在这里插入图片描述

2,JOSN

2.1,结构体,map,切片序列化

package main

import (
	"encoding/json"
	"fmt"
)

type Monster struct {
	Name string
	Age int
	Birthday string
	Sal float64
	Skill string
}

func testStruct()  {
	monster:=Monster{
		Name:     "牛魔王",
		Age:      500,
		Birthday: "2011-11-11",
		Sal:      8000.0,
		Skill:    "牛魔拳",
	}
	//将monster序列化
	content,err := json.Marshal(monster)
	if(err!=nil){
		fmt.Println("json err:",err)
	}
	fmt.Println("json struct:",string(content))
}

func testMap()  {
	var a3 map[string]string = map[string]string{
		"大姐姐":"林黛玉",
		"二姐姐":"薛宝钗",
		"三姐姐":"王熙凤",
	}
	//将monster序列化
	content,err := json.Marshal(a3)
	if(err!=nil){
		fmt.Println("json err:",err)
	}
	fmt.Println("json Map:",string(content))
}
func testSlice()  {
	var a3 map[string]interface{}
	a3 = make(map[string]interface{})
	a3["key1"]="lnl1"
	a3["key2"]="lnl2"
	a3["key3"]="lnl3"
	var slice[]map[string]interface{}
	slice = append(slice,a3)
	//将monster序列化
	content,err := json.Marshal(slice)
	if(err!=nil){
		fmt.Println("json err:",err)
	}
	fmt.Println("json Slice:",string(content))
}

func main() {
	testStruct()
	testMap()
	testSlice()
}

在这里插入图片描述

2.2,struct序列化时tag的使用

package main

import (
	"encoding/json"
	"fmt"
)

type Monster2 struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Birthday string `json:"birthday"`
	Sal float64 `json:"sal"`
	Skill string `json:"skill"`
}

func testStruct2()  {
	monster:=Monster2{
		Name:     "牛魔王",
		Age:      500,
		Birthday: "2011-11-11",
		Sal:      8000.0,
		Skill:    "牛魔拳",
	}
	//将monster序列化
	content,err := json.Marshal(monster)
	if(err!=nil){
		fmt.Println("json err:",err)
	}
	fmt.Println("json struct:",string(content))
}



func main() {
	testStruct2()

}

在这里插入图片描述

2.3,结构体,map,切片反序列化

package main

import (
	"encoding/json"
	"fmt"
)

type Monster3 struct {
	Name string
	Age int
	Birthday string
	Sal float64
	Skill string
}
func jsonToStruct()  {
	str:="{\"Name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}"
	var monster Monster3
	err := json.Unmarshal([]byte(str),&monster)
	if(err!=nil){
		fmt.Println("jsonToStruct err:",err)
	}
	fmt.Println(monster.Name)
	fmt.Println(monster.Age)
	fmt.Println(monster.Birthday)
	fmt.Println(monster.Sal)
	fmt.Println(monster.Skill)
}

func jsonToMap()  {
	str:="{\"三姐姐\":\"王熙凤\",\"二姐姐\":\"薛宝钗\",\"大姐姐\":\"林黛玉\"}"
	var a map[string]interface{}
	//反序列化时不需要make,会自动make
	//a3 = make(map[string]interface{})
	err := json.Unmarshal([]byte(str),&a)
	if(err!=nil){
		fmt.Println("jsonToStruct err:",err)
	}
	for key, value := range a {
		fmt.Println("key=>",key)
		fmt.Println("value=>",value)
	}
}

func jsonToSlice()  {
	str:="[{\"key1\":\"lnl1\",\"key2\":\"lnl2\",\"key3\":\"lnl3\"}]"
	var slice[]map[string]interface{}
	err := json.Unmarshal([]byte(str),&slice)
	if(err!=nil){
		fmt.Println("jsonToStruct err:",err)
	}
	for i := range slice {
		data:=slice[i]
		fmt.Println(data)
	}
}
func main() {
	jsonToStruct()
	//jsonToMap()
	//jsonToSlice()
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值