文件操作
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字符串转换为对应的数据结构
注意点
- 对于结构体的序列化,如果希望序列化后,字段的名字由我们重新定制,可以在结构体中定义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
}