iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言七篇入门教程五文件及包
  • 391
分享到

Go语言七篇入门教程五文件及包

2024-04-02 19:04:59 391人浏览 独家记忆
摘要

目录1. 文件处理1.1 JSON文件1.1.1 已知jsON结构1.1.2 未知JSON结构1.1.3 Encoder & Decoder1.2 XML文件1.3 二进制文

1. 文件处理

1.1 JSON文件

什么是json?

JSON(javascript Object Notation) 是一种轻量级的数据交换格式。
也是在web开发中的前后端交互的格式。

encoding/json是官方提供的标准 json, 实现 RFC 7159 中定义的 JSON 编码和解码。
使用的时候需要预定义 struct,原理是通过 reflection 和 interface 来完成工作。

常用的接口:


func Marshal(v interface{}) ([]byte, error) 	  // 生成 JSON
func Unmarshal(data []byte, v interface{}) error  // 解析 JSON 到 struct

1.1.1 已知JSON结构

先看例子


package main
import (
	"encoding/json"
	"fmt"
)
type Person struct {
	Name string
	Age   string
}
type PersonSlice struct {
	Persons []Person
}
func main() {
	var s PersonSlice
	str := `{"persons":[{"Name":"FanOne","Age":"17"},{"Name":"FanOne2","Age":"18"},{"Name":"FanOne3","Age":"19"}]}`
	_ = json.Unmarshal([]byte(str), &s) 
	// golang中提供软件包"encoding/json"可以直接用来处理JSON文件,此包中解析JSON的函数为Unmarshal
	// 使用此函数可以将JSON文件解析到结构体中
	fmt.Println(s.Persons)//[{FanOne 17} {FanOne2 18} {FanOne3 19}]
	for _,item:=range s.Persons{
		fmt.Println("Name",item.Name,"Age",item.Age)
		//Name FanOne Age 17
		//Name FanOne2 Age 18
		//Name FanOne3 Age 19
	}
}

上例中,首先定义了与json数据对应的结构体,数组对应slice,字段名对应JSON里面的KEY,

在解析的时候,如何将json数据与struct字段相匹配呢?例如JSON的key是Name,那么怎么找对应的字段呢?

  • 首先查找tag含有Name的可导出的struct字段(首字母大写)
  • 其次查找字段名是Name的导出字段
  • 最后查找类似NAME或者NaMe这样的除了首字母之外其他大小写不敏感的导出字段

其中需要注意一点:能够被赋值的字段必须是可导出字段(即首字母大写)。因为只有首字母大写才能被外面应用,同时JSON解析的时候只会解析能找得到的字段,找不到的字段会被忽略。

这样的一个好处是:当你接收到一个很大的JSON数据结构而你却只想获取其中的部分数据的时候,你只需将你想要的数据对应的字段名大写,即可轻松解决这个问题。

虽然没有python直接.json那么方便,但是也还是算不错的。

1.1.2 未知JSON结构

众所周知,在Go语言中,interface{}可以用来存储任意数据类型的对象,此数据结构正好用于存储解析的未知结构的json数据的结果。

JSON包中采用map[string]interface{}[]interface{}结构来存储任意的JSON对象和数组。

Go类型和JSON类型的对应关系如下:

bool 代表 JSON booleans,

float64 代表 JSON numbers,

string 代表 JSON strings,

nil 代表 JSON null.


b := []byte(`{
		"Name": "FanOne",
		"School": ["FZU", "XCZX", "UUUU", "GuaguaSong", "HanTuo",
		"City", "FuZhou"],
		"Major": "BigData",
		"IsPublished": true,
		"Price": 9.99,
		"Sales": 1000000
}`)
var r interface{}
err := json.Unmarshal(b, &r)

在上述代码中,r 被定义为一个空接口。
json.Unmarshal()函数将一个 JSON 对象解码
到空接口 r 中,最终 r 将会是一个键值对的map[string]interface{}结构:


	map[string]interface{}{ 
		"Name": "FanOne",
		"School": ["FZU", "XCZX", "UUUU", "GuaguaSong", "HanTuo",
		"City", "FuZhou"],
		"Major": "BigData",
		"IsPublished": true,
		"Price": 9.99,
		"Sales": 1000000
	}

要访问解码后的数据结构,需要先判断目标结构是否为预期的数据类型:

gobook, ok := r.(map[string]interface{})

然后,我们可以通过 for 循环搭配 range 语句一一访问解码后的目标数据:


	if ok {
		for k, v := range gobook
		{
			switch v2 := v.(type)
			{
			case string:
				fmt.Println(k, "is string", v2)
			case int:
				fmt.Println(k, "is int", v2)
			case bool:
				fmt.Println(k, "is bool", v2)
			case []interface{}:
				fmt.Println(k, "is an array:")
				for i, iv := range v2 {
					fmt.Println(i, iv)
				}
			default:
				fmt.Println(k, "is another type not handle yet")
			}
		}
	}

虽然有些烦琐,但的确是一种解码未知结构的 JSON 数据的安全方式。

1.1.3 Encoder & Decoder

Go 内建的 encoding/json 包还提供 Decoder 和 Encoder 两个类型,用于支持 JSON 数据的流式读写,并提供 NewDecoder()和 NewEncoder()两个函数来便于具体实现:


func NewDecoder(r io.Reader) *Decoder
func NewEncoder(w io.Writer) *Encoder

func main() {
	dec := json.NewDecoder(os.Stdin)
	enc := json.NewEncoder(os.Stdout)
	for {
		var v map[string]interface{}
		if err := dec.Decode(&v); err != nil{
			log.Println(err)
			return
		}
		for k := range v {
			if k != "Name" {
				v[k] = nil,false
			}
		}
		if err := enc.Encode(&v); err != nil{
			log.Println(err)
		}
	}
}

使用 Decoder 和 Encoder 对数据流进行处理可以应用得更为广泛些,比如读写 Http 连接、websocket 或文件等,Go 的标准库 net/rpc/jsonrpc 就是一个应用了 Decoder 和 Encoder的实际例子。

1.2 XML文件

XML 数据格式
对于如下的XML:


<Person>
    <FirstName>Fan</FirstName>
    <LastName>One</LastName>
</Person>

和 JSON 的方式一样,XML 数据可以序列化为结构,或者从结构反序列化为 XML 数据;

encoding/xml包实现了一个简单的 XML 解析器(SAX),用来解析 XML 数据内容。下面的例子说明如何使用解析器:


复制代码
// xml.go
package main
import (
    "encoding/xml"
    "fmt"
    "strings"
)
var t, token xml.Token
var err error
func main() {
    input := "<Person><FirstName>Fan</FirstName><LastName>One</LastName></Person>"
    inputReader := strings.NewReader(input)
    p := xml.NewDecoder(inputReader)
    for t, err = p.Token(); err == nil; t, err = p.Token() {
        switch token := t.(type) {
        case xml.StartElement:
            name := token.Name.Local
            fmt.Printf("Token name: %s\n", name)
            for _, attr := range token.Attr {
                attrName := attr.Name.Local
                attrValue := attr.Value
                fmt.Printf("An attribute is: %s %s\n", attrName, attrValue)
            }
        case xml.EndElement:
            fmt.Println("End of token")
        case xml.CharData:
            content := string([]byte(token))
            fmt.Printf("This is the content: %v\n", content)
            // ...
        default:
            // ...
        }
    }
}

输出:


Token name: Person
Token name: FirstName
This is the content: Fan
End of token
Token name: LastName
This is the content: One
End of token
End of token

包中定义了若干XML 标签类型:StartElement,Chardata(这是从开始标签到结束标签之间的实际文本)EndElement,Comment,Directive 或 ProcInst。

包中同样定义了一个结构解析器:
NewParser 方法持有一个 io.Reader(这里具体类型是strings.NewReader)并生成一个解析器类型的对象。
还有一个 Token() 方法返回输入流里的下一个 XML token。在输入流的结尾处,会返回(nil,io.EOF)
XML 文本被循环处理直到 Token() 返回一个错误,因为已经到达文件尾部,再没有内容可供处理了。
通过一个 type-switch 可以根据一些 XML 标签进一步处理。Chardata中的内容只是一个 []byte,通过字符串转换让其变得可读性强一些。

1.3 二进制文件

go语言可以在win下进行如下的设置将go程序build成二进制文件

请添加图片描述


set CGO_ENABLED=0
set GOOS=linux
set GOARCH=amd64
go build main.go

1.4 zip文件

1.4.1 创建zip

Go语言提供了arcHive/zip包来处理zip压缩文件


func createZip(filename string) {
	// 缓存压缩文件内容
	buf := new(bytes.Buffer)
	// 创建zip
	writer := zip.NewWriter(buf)
	defer writer.Close()
	// 读取文件内容
	content, _ := ioutil.ReadFile(filepath.Clean(filename))
	// 接收
	f, _ := writer.Create(filename)
	f.Write(content)
	filename = strings.TrimSuffix(filename, path.Ext(filename)) + ".zip"
	ioutil.WriteFile(filename, buf.Bytes(), 0644)
}

1.4.2 读取zip文件

读取zip文档过程与创建zip文档过程类似,需要解压后的文档目录结构创建:


func readZip(filename string) {
      zipFile, err := zip.OpenReader(filename)  // 打开zip文件
		if err != nil {
			panic(err.Error())
		}
		defer zipFile.Close()
		for _, f := range zipFile.File {  // 循环读取zip中的内容
			info := f.FileInfo()
			if info.IsDir() { 
				err = os.MkdirAll(f.Name, os.ModePerm)
				if err != nil {
					panic(err.Error())
				}
				continue
			}
			srcFile, err := f.Open()  // 打开文件
			if err != nil {
				panic(err.Error())
			}
			defer srcFile.Close()
			newFile, err := os.Create(f.Name)
			if err != nil {
				panic(err.Error())
			}
			defer newFile.Close()
			io.Copy(newFile, srcFile)
		}
}

2. 包管理

2.1 包路径

每一个包都通过一个唯一的字符串进行标识,它称为导入路径,他们用在import声明当中。
对于准备共享或公开的包需要全局唯一。当然也要保证没有循环的导包,循环的导包会引起报错,而这也就涉及到了程序项目的整体层次结构上了,这点以后再说。

2.2 包声明

在每一个Go源文件的路径的最后一段,需要进行声明。主要目的是当该包被其他包引入的时候作为默认的标识符。

例如在引入 "fmt"之后,可以访问到它的成员,fmt.Println(),可以注意到这个P是大写的,说明了,要大写才能跨包引用。

当我们导用的包的名字没有在文件中引用的时候,就会有一个编译错误。我们可以使用_来代表

表示导入的内容为空白标识符。

在这里插入图片描述

以上就是Go语言七篇入门教程五文件及包的详细内容,更多关于Go语言文件及包的资料请关注编程网其它相关文章!

如何学习Go

如果你是小白,你可以这样学习Go语言~

七篇入门Go语言

第一篇:Go简介初识

第二篇:程序结构&&数据类型的介绍

第三篇:函数方法接口的介绍

第四篇:通道与Goroutine的并发编程

第六篇:网络编程

第七篇:GC垃圾回收三色标记

您可能感兴趣的文档:

--结束END--

本文标题: Go语言七篇入门教程五文件及包

本文链接: https://www.lsjlt.com/news/156862.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言七篇入门教程五文件及包
    目录1. 文件处理1.1 JSON文件1.1.1 已知JSON结构1.1.2 未知JSON结构1.1.3 Encoder & Decoder1.2 XML文件1.3 二进制文...
    99+
    2024-04-02
  • Go语言七篇入门教程四通道及Goroutine
    目录1. 前言2. 通道简介2.1 声明2.1 读写2.3 通道详解2.3.1 例子2.3.2 死锁2.3.3 关闭通道2.3.4 缓冲区2.3.5 通道的长度和容量2.3.6 单向...
    99+
    2024-04-02
  • Go语言七篇入门教程六网络编程
    目录1. Socket 编程1.1 Dial()函数2. HTTP 编程2.1 HTTP 客户端2.2 HTTP 服务端2.2.1 处理 HTTP 请求3. RPC 编程3.1 Go...
    99+
    2024-04-02
  • Go语言七篇入门教程三函数方法及接口
    目录1. 函数2. 方法3. 接口如何学习Go参考书籍: 《go语言程序设计》 1. 函数 每个函数声明都包含一个名字,一个形参列表,一个可选的返回列表以及函数体: func ...
    99+
    2024-04-02
  • Go语言七篇入门教程一简介初识
    目录简介为什么是GoGo应用WebCloud 云BlockChain 区块链如何学习Go其实我自己接触Go语言也还不到一年,20年的10月我才开始学Go的。 我自己也并不是很懂,但是...
    99+
    2024-04-02
  • Go语言七篇入门教程七GC垃圾回收三色标记
    目录GC如何判断一个对象是否可达 三色标记法原理如下如何学习GoGC GC全称Garbage Collection 目前主流的垃圾回收算法有两类,分别是追踪式垃圾回收算法(Traci...
    99+
    2024-04-02
  • Go语言七篇入门教程二程序结构与数据类型
    目录1. 程序结构1.1 名称1.2 声明1.3 注释1.4 单双引号1.5 输出2. 数据类型2.1 整型2.2 浮点型2.3 复数2.4 布尔型2.5 字符串2.6 常量2.7 ...
    99+
    2024-04-02
  • C语言文件操作的入门详解教程
    目录一.一些需要掌握的知识点1.文件名2.文件类型3.数据流4.文件缓冲区5.文件指针二.与文件操作相关的一些函数 1.文件的打开及关闭2.文件的顺序读写3.文件的随机读写...
    99+
    2024-04-02
  • Python入门教程(三十七)Python中的删除文件
    目录删除文件删除文件 “demofile.txt”:检查文件是否存在检查文件是否存在,然后删除它:删除文件删除文件夹 “myfolder&rdqu...
    99+
    2023-05-19
    Python文件 Python 删除文件
  • Go语言中文件处理入门指南
    go 语言文件处理入门指南本文指南介绍了 go 语言中文件处理的基本概念和技术,包括:文件创建:使用 os.create 函数创建新文件。文件读取:使用 os.open 函数打开文件,并...
    99+
    2024-04-08
    go语言 文件处理
  • Go语言中文文档及教程大全
    有志者,事竟成!如果你在学习Golang,那么本文《Go语言中文文档及教程大全》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~Go语言的...
    99+
    2024-04-04
  • Go语言基础教程:快速入门指南
    标题:Go语言基础教程:快速入门指南 在当今软件开发领域,Go语言因其简洁高效、并发性强等特点逐渐受到了广泛关注和应用。本篇文章将带领大家快速入门Go语言,通过具体的代码示例帮助读者更...
    99+
    2024-04-02
  • Python入门教程(三十五)Python中文件的打开
    目录在服务器上打开文件只读取文件的一部分返回文件中的前五个字符:读行读取文件中的两行:逐行遍历文件:关闭文件完成后关闭文件:在服务器上打开文件 假设我们有以下文件,位于与 Pytho...
    99+
    2023-05-18
    Python 文件 Python 文件读取
  • 从入门到精通:Go语言中的自然语言处理教程
    自然语言处理(Natural Language Processing,NLP)是计算机科学、人工智能和语言学交叉领域中的一个重要分支,其目的是让计算机能够理解和处理自然语言。随着人工智能技术的不断发展,自然语言处理的应用场景也越来越广泛,...
    99+
    2023-07-25
    教程 自然语言处理 异步编程
  • Unix下的Go语言load教程:从入门到精通
    Go语言是一种开源的编程语言,它最初由Google开发。它的设计目标是提供一种简单、快速、可靠的编程语言,同时还支持并发编程。在Unix系统下,Go语言被广泛使用。在本文中,我们将学习如何在Unix下使用Go语言进行load操作。 安装...
    99+
    2023-08-23
    load 教程 unix
  • Go语言快速入门指针Map使用示例教程
    目录1. 指针1.1 指针地址和指针类型1.2 指针取值1.3 空指针1.4 new 的使用1.5 new与make的区别2. Map2.1 什么是Mapkey,value存储has...
    99+
    2024-04-02
  • C语言文件操作零基础新手入门保姆级教程
    目录一、前言二、文件操作基础知识①什么是文件②数据文件类型③数据如何存储④如何读取二进制文件⑤什么是文件名⑥文件缓冲区⑦文件指针三、文件操作函数①fopen 与 fclos...
    99+
    2024-04-02
  • TCL脚本语言光速入门教程,一篇就够了(超全查表)
             目录 引子:初见TCL 基本命令 置换命令 普通置换 变量置换 命令置换 反斜杠置换 其他置换 脚步命令 eval命令 source命令 语言命令 简单变量 数组变量 重构变量及其操作 补充概念 全局变量和局部变量 小结 ...
    99+
    2023-08-31
    开发语言 c++ linux 服务器 网络协议
  • 从入门到精通:Go语言中NumPy对象的完整教程
    Go语言是一门目前非常流行的编程语言,它的特点是简单、快速、安全和并发。在Go语言中,NumPy对象是非常重要的数据结构之一,它可以帮助我们进行数学运算和数据分析等方面的工作。 本文将从入门到精通为大家介绍Go语言中NumPy对象的完整教程...
    99+
    2023-08-28
    numpy 对象 教程
  • Windows 上的 Go 文件处理教程:从入门到精通!
    Go 语言是一种现代化的编程语言,它在速度和可靠性方面都表现出色,因此越来越多的开发者开始选择使用它。Go 语言在处理文件方面也非常出色,它提供了一系列的标准库和功能,可以让你轻松地读取、写入、修改文件。在本文中,我们将深入探讨在 Win...
    99+
    2023-11-10
    windows 文件 教程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作