go语言文件

简介: go语言文件

文章目录


前言


介绍各类文件经常用来做什么工作,以及在Go语言中操作各类文件的方法


一、文件类型及作用?


①文件的职能作用


文件一般都有后缀名,根据他的后缀名区分文件的职能类型,比如jpg,png后缀结尾的是照片,txt结尾的是文本文件…

一般的文件大家都知道是用来干什么的就不进行详细阐述了,一下主要讲解一下大家可能不太了解的文件类型,


(1)json文件


JSON文件是用来存储简单的数据结构和对象的文件,可以在web应用程序中进行数据交换
JSON是全称为JavaScript Object Notation,是一种有条理,易于访问的存储信息的方法。
• 1
• 2


代码如下:


[{"Name":"Golang",
"Url":"http://c.biancheng.net/golang/","
Course":["http://c.biancheng.net/cplus/","http://c.biancheng.net/linux_tutorial/"]},
{"Name":"Java",
"Url":"http://c.biancheng.net/java/",
"Course":["http://c.biancheng.net/socket/","http://c.biancheng.net/python/"]}]


(2)xml文件


可扩展标记语言,标准通用标记语言的子集,简称XML。 是一种用于标记电子文件使其具有结构性的标记语言。
一般存储映射关系,在javaweb中有应用web.xml在人工智能中也有应用,比如进行深度学习目标检测用到的数据集,
可以使用xml文件记录一种映射关系对需要训练的数据集进行标注。


代码如下:


 <annotation>
  <folder>VOC2012</folder>
  <filename>2007_000027.jpg</filename>
  <source>
    <database>The VOC2007 Database</database>
    <annotation>PASCAL VOC2007</annotation>
    <image>flickr</image>
  </source>
  <size>
    <width>486</width>
    <height>500</height>
    <depth>3</depth>
  </size>
  <segmented>0</segmented>
  <object>
    <name>person</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>174</xmin>
      <ymin>101</ymin>
      <xmax>349</xmax>
      <ymax>351</ymax>
    </bndbox>
    <part>
      <name>head</name>
      <bndbox>
        <xmin>169</xmin>
        <ymin>104</ymin>
        <xmax>209</xmax>
        <ymax>146</ymax>
      </bndbox>
    </part>
    <part>
      <name>hand</name>
      <bndbox>
        <xmin>278</xmin>
        <ymin>210</ymin>
        <xmax>297</xmax>
        <ymax>233</ymax>
      </bndbox>
    </part>
    <part>
      <name>foot</name>
      <bndbox>
        <xmin>273</xmin>
        <ymin>333</ymin>
        <xmax>297</xmax>
        <ymax>354</ymax>
      </bndbox>
    </part>
    <part>
      <name>foot</name>
      <bndbox>
        <xmin>319</xmin>
        <ymin>307</ymin>
        <xmax>340</xmax>
        <ymax>326</ymax>
      </bndbox>
    </part>
  </object>
</annotation>


(3)gob二进制文件


gob是 Go Binary的简写,是将go语言结构体进行序列化的一种方式,gob文件属于自描述文件,他里面包含所有类型的自描述
进行解码的时候不需要了解文件的内容,在编码解码过程中,零值会被忽略,在解码过程中只有只有匹配名称,和可兼容字段才会被
解码


注意:gob二进制文件比较安全,无法直接打开


Go语言操作文件的注意点


(1)操作json文件时:


保持字段名大写,可以将对应的字段加入到json文件内


(2)操作xml文件:


结构体字段名后面可以跟类似  `xml:"Name,attr"`、`xml:"Url>Course"`的字符串,用来解释这个字段在xml中的层次结构
除了这两种还有'xml:",chardata"'     将本字段当作字符数据来写
            'xml:",innerxml"'       将本字段按照字面量来写
            'xml:",comment"'        改字段将作为xml注释,写进xml文件


③打开文件的权限


(1)打开文件使用的函数


func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
  name为文件名,flag为打开文件权限方式


(2)flag的种类及作用


  O_RDONLY:只读模式打开文件;
  O_WRONLY:只写模式打开文件;
  O_RDWR:读写模式打开文件;
  O_APPEND:写操作时将数据附加到文件尾部(追加);
  O_CREATE:如果不存在将创建一个新文件;
  O_EXCL:和 O_CREATE 配合使用,文件必须不存在,否则返回一个错误;
  O_SYNC:当进行一系列写操作时,每次都要等待上次的 I/O 操作完成再进行;
  O_TRUNC:如果可能,在打开时清空文件。


二、实战使用Go语言操作文件


1.操作json文件


①写文件


代码如下(示例):


package main
import (
  "encoding/json"
  "fmt"
  "os"
)
type Website struct {
  // 由于权限问题,结构体转json数据格式时会主动频闭掉小写字母开头的数据
  // 结构体转json需要将共享的字段进行大写
  Name   string `xml:"Name,attr"`
  Url    string
  Course []string
}
func main() {
  //数据
  info := []Website{{"Golang", "http://c.biancheng.net/golang/", 
  []string{"http://c.biancheng.net/cplus/", "http://c.biancheng.net/linux_tutorial/"}},
    {"Java", "http://c.biancheng.net/java/", []string{"http://c.biancheng.net/socket/", 
    "http://c.biancheng.net/python/"}}}
  // 创建json文件
  // fmt.Println(info)
  fp, err := os.Create("info.json")
  if err != nil {
    fmt.Println("文件创建失败!", err.Error())
    return
  }
  //延时执行fp.Close()
  defer fp.Close()
  // 使用打开的文件创建json编码器
  encoder := json.NewEncoder(fp)
  //将json数据编码进文件内
  err = encoder.Encode(info)
  if err != nil {
    fmt.Println("编码错误", err.Error())
  } else {
    fmt.Println("编码成功!")
  }
  fmt.Println("hello")
}


①读文件


代码如下(示例):


package main
import (
  "encoding/json"
  "fmt"
  "os"
)
type Website struct {
  Name   string
  Url    string
  Course []string
}
func main() {
  fp, err := os.Open("info.json")
  if err != nil {
    fmt.Println("文件打开失败!", err.Error())
    return
  }
  defer fp.Close()
  var info []Website
  // 创建json编码器(将json文件与json对象进行绑定)
  decoder := json.NewDecoder(fp)
  // 从json对象绑定的json文件读取数据
  err = decoder.Decode(&info)
  if err != nil {
    fmt.Println("解码失败!")
    return
  } else {
    fmt.Println(info)
  }
  // json数据格式对象返回的是键值对
  for temp, v := range info {
    fmt.Println(temp, v)
  }
  fmt.Println("123")
}


2.操作xml文件


①写文件


代码如下(示例):


package main
import (
  "encoding/xml"
  "fmt"
  "os"
)
/*
  使用go语言进行xml格式文件处理的时候,需要一一对应标签
*/
type Website struct {
  Name   string `xml:"Name,attr"`
  Url    string //`xml:"Url>Course"`
  Course []string
}
func main() {
  //实例化对象
  info := []Website{{"C语言中文网", "http://c.biancheng.net/golang/", 
    []string{"Go语言入门教程", "Golang入门教程"}},
    {"python程序设计", "http://c.biancheng.net/golangs/", []string{"人工智能", "网络爬虫"}}}
  fp, err := os.Create("info.xml")
  if err != nil {
    fmt.Println("出错了!", err.Error())
    return
  }
  defer fp.Close()
  // 序列化到文件
  encoder := xml.NewEncoder(fp)
  err = encoder.Encode(info)
  if err != nil {
    fmt.Println("编码错误!", err)
  } else {
    fmt.Println("编码成功!")
  }
  fmt.Println("123")
}


②读文件


代码如下(示例):


package main
import (
  "encoding/xml"
  "fmt"
  "os"
)
type Website struct {
  Name   string `xml:"Name,attr"`
  Url    string `xml:"Url>Course"`
  Course []string
}
func main() {
  // 打开一个文件
  fp, err := os.Open("info.xml")
  if err != nil {
    fmt.Println("打开失败!")
    return
  }
  defer fp.Close()
  info := []Website{}
  // 加载一个解码器
  decoder := xml.NewDecoder(fp)
  // 值得注意的是,读取xml文件时不是将数据一次读取完,而是每次读取一行组数据
  err = decoder.Decode(&info)
  err = decoder.Decode(&info)
  if err != nil {
    fmt.Println("解码失败!", err)
  } else {
    fmt.Println(info)
  }
  fmt.Println("123")
}


3.操作gob文件


①读、写文件


代码如下:


package main
import (
  "encoding/gob"
  "fmt"
  "os"
)
/*
  gob是 Go Binary的简写,是将go语言结构体进行序列化的一种方式,gob文件属于自描述文件,他里面包含所有类型的自描述
  进行解码的时候不需要了解文件的内容,在编码解码过程中,零值会被忽略,在解码过程中只有只有匹配名称,和可兼容字段才会被
  解码
*/
func main() {
  // 创建对象
  info := map[string]string{
    "name":    "C语言中文网",
    "website": "http://c.biancheng.net/golang/",
  }
  name := "demo.gob"
  fp, err := os.Create(name)
  if err != nil {
    fmt.Println("创建失败!", err)
    return
  }
  defer fp.Close()
  // 创建编码器,进行编码序列化进文件
  encoder := gob.NewEncoder(fp)
  err = encoder.Encode(info)
  if err != nil {
    fmt.Println("编码失败!", err)
  } else {
    fmt.Println("编码成功!")
  }
  // 移动文件描述符,将文件内的光标移到开头
  // 第一个参数是偏移量,第二个参数0代表开头,1代表自身,2代表文件末尾
  fp.Seek(0, 0)
  // 加载一个解码器,对前面创建的文件进行解码
  decoder := gob.NewDecoder(fp)
  var infos map[string]string
  err = decoder.Decode(&infos)
  if err != nil {
    fmt.Println("error", err)
    fmt.Println("解码失败!")
    return
  } else {
    fmt.Println("解码成功!")
  }
  // 打印解码出来的数据
  for k := range infos {
    fmt.Println(k, "对应的值是:", infos[k])
  }
  fmt.Println("123")
}


4.操作普通文本文件


①读、写文件


代码如下:


package main
import (
  "bufio"
  "fmt"
  "io"
  "os"
)
func main() {
  // 打开一个文件
  fp, err := os.Create("text.txt")
  if err != nil {
    fmt.Println("创建失败!", err)
  }
  defer fp.Close()
  // 写入内容
  writer := bufio.NewWriter(fp)
  // 写入时先将东西写入缓冲区
  writer.WriteString("hello\nTom\n")
  // 想要将缓冲区的数据写入磁盘就需要刷新缓冲区
  writer.Flush()
  // 文件光标移到初始位置
  fp.Seek(0, 0)
  read := bufio.NewReader(fp)
  for {
    str, err := read.ReadString('\n') //表示一次读一行,其中传进去的是每次中断的符号
    if err == io.EOF {
      break
    }
    fmt.Print(str)
  }
  fmt.Println("hello")
}


5.操作普通二进制文本文件


①读、写文件


普通二进制文件与gob二进制文件的区别就是普通二进制文件不带自描述,必须人为按照一定的数据格式进行解码


代码如下:


package main
import (
  "bytes"
  "encoding/binary"
  "fmt"
  "os"
)
type WebSite struct {
  Url int32
}
func main() {
  fp, err := os.Create("text.bin")
  if err != nil {
    fmt.Println("创建失败!", err)
  }
  defer fp.Close()
  for i := 0; i < 10; i++ {
    info := WebSite{int32(i)}
    var bin_buf bytes.Buffer
    binary.Write(&bin_buf, binary.LittleEndian, info)
    b := bin_buf.Bytes()
    _, err = fp.Write(b)
    if err != nil {
      fmt.Println("编码失败!", err)
      return
    }
  }
  fmt.Println("123")
}


6.操作压缩文件


①读、写文件


对压缩文件进行层次化的压缩与解压缩


代码如下:


package main
import (
  "archive/zip"
  "bytes"
  "fmt"
  "io"
  "os"
)
func main() {
  // 创建一个缓冲区用来保存文件内容
  buf := new(bytes.Buffer)
  // 创建一个压缩文件夹
  w := zip.NewWriter(buf)
  // 将文件加入压缩文档
  var file = []struct {
    Name, Body string
  }{
    {"GoLong", "https666"}}
  // 迭代数据,使用数据创建文件
  for _, file := range file {
    // 在压缩文档内创建文件
    f, err := w.Create(file.Name)
    if err != nil {
      fmt.Println(err)
    }
    // 在创建好的文件内写数据
    _, err = f.Write([]byte(file.Body))
    if err != nil {
      fmt.Println(err)
    }
  }
  // 关闭压缩文档
  err := w.Close()
  if err != nil {
    fmt.Println(err)
  }
  f, err := os.Create("file.zip")
  if err != nil {
    fmt.Println(err)
  }
  // 将缓冲区的东西写到f文件内
  buf.WriteTo(f)
  // 读取压缩文件中的内容
  // 打开一个zip格式文件
  r, err := zip.OpenReader("file.zip")
  if err != nil {
    fmt.Println(err)
  }
  defer r.Close()
  // 迭代压缩文件
  for _, f := range r.File {
    fmt.Printf("文件名:%s\n", f.Name)
    rc, err := f.Open()
    if err != nil {
      fmt.Println(err)
    }
    _, err = io.CopyN(os.Stdout, rc, int64(f.UncompressedSize64))
    if err != nil {
      fmt.Println(err.Error())
    }
    rc.Close()
  }
  fmt.Println("123")
}


总结


这里仅仅介绍了各种文件的简单读写操作方式,如果熟练地操作各种文件还需要参考官方文档。

相关文章
|
10天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
30 2
|
9天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
19 2
|
9天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
21 2
|
4天前
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
18 4
|
4天前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
28 1
|
7天前
|
Go
go语言中的continue 语句
go语言中的continue 语句
17 3
|
8天前
|
安全 Go 调度
探索Go语言的并发模型:goroutine与channel
在这个快节奏的技术世界中,Go语言以其简洁的并发模型脱颖而出。本文将带你深入了解Go语言的goroutine和channel,这两个核心特性如何协同工作,以实现高效、简洁的并发编程。
|
9天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
17 4
|
9天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
42 1
|
2天前
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
12 0