【Go】 编码解码基础,encoding标准库:base64、binrary、json、xml、gob、hex、pem、csv

        

目录

base64

binary

json

xml

CSV

GOB

HEX

PEM

总结


        在 Go 语言中,encoding 标准库提供了多种用于数据编码和解码的包,如 asn1base64binaryjsonxml 等。下面我将分别介绍这些包的基本使用方法。

base64

  encoding/base64 包用于处理 Base64 编码,这是一种常见的用于在文本中表示二进制数据的编码方式。

package mainimport ("encoding/base64""fmt"
)func main() {input := "hello world"// 编码enc := base64.StdEncoding.EncodeToString([]byte(input))fmt.Println("Encoded:", enc)// 解码dec, err := base64.StdEncoding.DecodeString(enc)if err != nil {fmt.Println("Error:", err)return}fmt.Println("Decoded:", string(dec))
}

base64原理:

Base64原理-CSDN博客 

binary

   encoding/binary 包用于处理二进制数据的编码和解码,支持固定大小的数据结构。

package mainimport ("bytes""encoding/binary""fmt"
)func main() {buf := bytes.NewBuffer([]byte{})binary.Write(buf, binary.BigEndian, int32(1000))fmt.Println(buf.Bytes())var num int32binary.Read(buf, binary.BigEndian, &num)fmt.Println(num)
}

另一个例子:

package mainimport ("bytes""encoding/binary""fmt"
)func main() {// 创建一个新的字节缓冲buf := bytes.NewBuffer([]byte{})buf2 := bytes.NewBuffer([]byte{})// 写入各种数据类型binary.Write(buf, binary.BigEndian, int64(1000))binary.Write(buf, binary.BigEndian, float32(123.456))binary.Write(buf, binary.BigEndian, float64(789.0123))// 写入字符串需要先转为字节数组str := "╬~皿~"runes := []rune(str)buf3 := new(bytes.Buffer)err := binary.Write(buf3, binary.BigEndian, runes)if err != nil {fmt.Println("binary.Write failed:", err)return}fmt.Println(buf3.Bytes())binary.Write(buf2, binary.BigEndian, []byte(str))// 读取 int64var num1 int64binary.Read(buf, binary.BigEndian, &num1)fmt.Println("int64:", num1)// 读取 float32var num2 float32binary.Read(buf, binary.BigEndian, &num2)fmt.Println("float32:", num2)// 读取 float64var num3 float64binary.Read(buf, binary.BigEndian, &num3)fmt.Println("float64:", num3)// 读取字符串bytesStr := make([]byte, len(str))binary.Read(buf2, binary.BigEndian, &bytesStr)fmt.Println("string:", string(bytesStr))
}

         需要知道,go中string是UTF-8编码已经能满足中文,但是要更大的字符集需要rune。

 

json

  encoding/json 包用于处理 JSON 数据格式的编码和解码。

package mainimport ("encoding/json""fmt""os"
)type Person struct {Name string `json:"name"`Age  int    `json:"age"`
}func main() {p := Person{"Bob", 25}data, err := json.Marshal(p)if err != nil {fmt.Fprintf(os.Stderr, "Error: %v", err)return}fmt.Println(string(data))var newP Personjson.Unmarshal(data, &newP)fmt.Println(newP)
}

xml

 encoding/xml 包类似于 encoding/json,但用于处理 XML 数据。

package mainimport ("encoding/xml""fmt""os"
)type Person struct {XMLName xml.Name `xml:"person"`Name    string   `xml:"name"`Age     int      `xml:"age"`
}func main() {p := Person{Name: "Alice", Age: 30}data, err := xml.MarshalIndent(p, "", "  ")if err != nil {fmt.Fprintf(os.Stderr, "Error: %v", err)return}fmt.Println(string(data))var newP Personxml.Unmarshal(data, &newP)fmt.Println(newP)
}

 

CSV

        CSV (Comma-Separated Values) 是一种常见的文本文件格式,用于存储表格数据。encoding/csv 包可以方便地读取和写入 CSV 文件。

package mainimport ("encoding/csv""os""fmt"
)func main() {records := [][]string{{"name", "age"},{"Alice", "30"},{"Bob", "25"},}file, err := os.Create("data.csv")if err != nil {fmt.Println("Error:", err)return}defer file.Close()writer := csv.NewWriter(file)writer.WriteAll(records) // 写入多行记录if err := writer.Error(); err != nil {fmt.Println("Error:", err)}
}

GOB

        GOB 是 Go 自己的二进制格式,用于在 Go 程序之间传输数据结构。encoding/gob 包提供了编码和解码 GOB 数据的功能。

package mainimport ("bytes""encoding/gob""fmt"
)type Person struct {Name stringAge  int
}func main() {var buf bytes.Bufferenc := gob.NewEncoder(&buf)dec := gob.NewDecoder(&buf)p := Person{"Alice", 30}enc.Encode(p)var newP Persondec.Decode(&newP)fmt.Println(newP)
}

HEX

        HEX 格式常用于将二进制数据以十六进制字符串的形式表示。encoding/hex 包提供了对 HEX 编码和解码的支持。

package mainimport ("encoding/hex""fmt"
)func main() {src := []byte("hello world")encodedStr := hex.EncodeToString(src)fmt.Println("Encoded:", encodedStr)decodedBytes, err := hex.DecodeString(encodedStr)if err != nil {fmt.Println("Decode error:", err)return}fmt.Println("Decoded:", string(decodedBytes))
}

PEM

        PEM (Privacy Enhanced Mail) 格式是一种将加密密钥或证书存储为 ASCII 编码的格式。encoding/pem 包用于编码和解码 PEM 数据。

package mainimport ("encoding/pem""os""fmt"
)func main() {block := &pem.Block{Type:  "MY CERTIFICATE",Bytes: []byte("your certificate data here"),}file, err := os.Create("certificate.pem")if err != nil {fmt.Println("Error:", err)return}defer file.Close()err = pem.Encode(file, block)if err != nil {fmt.Println("Error:", err)}
}

总结

        在 Go 语言中,通过 encoding 标准库及其子包,我们可以高效地处理多种数据格式,每种格式均有其特定用途:

  1. ASN.1:适用于处理复杂的数据结构,常用于安全和网络协议中。
  2. Base64:用于在文本中表示二进制数据,广泛用于数据编解码。
  3. Binary:直接以二进制形式读写固定大小的数据,用于低层数据操作。
  4. JSON:处理现代网络通信中普遍使用的数据格式,易于数据交换。
  5. XML:用于标记化的数据表示,常见于配置文件和网络服务。
  6. CSV:用于读写简单的表格数据,广泛应用于数据导入导出。
  7. GOB:Go 特有的二进制格式,优化了同语言间的数据结构传输。
  8. HEX:将二进制数据表示为十六进制字符串,用于编码和调试。
  9. PEM:处理加密密钥和证书,关键于安全领域。

        通过掌握这些工具,Go 程序员可以灵活地在多种应用场景中处理和传输数据,从而提高开发效率和系统性能。这些技术的深入理解和妥善使用,是每位 Go 开发者技能提升的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标准版uni-app移动端页面添加/开发操作流程

页面简介 uni-app项目中,一个页面就是一个符合Vue SFC规范的.vue文件或.nvue文件。 .vue页面和.nvue页面,均全平台支持,差异在于当uni-app发行到App平台时,.vue文件会使用webview进行渲染,.nvue会使用原生进行渲染。…

centos开机自启的方式总结

centos管理服务的开机自启的方式有这些: 1. systemctl systemctl使用enable/disable来开机自启和禁用开机自启: systemctl enable sshd 开机自动的配置文件存储在/etc/systemd下。 2.chkconfig 这个命令是用于简化服务的管理,和systemct…

用海豚调度器定时调度从Kafka到HDFS的kettle任务脚本

在实际项目中,从Kafka到HDFS的数据是每天自动生成一个文件,按日期区分。而且Kafka在不断生产数据,因此看看kettle是不是需要时刻运行?能不能按照每日自动生成数据文件? 为了测试实际项目中的海豚定时调度从Kafka到HDF…

ActiveMQ主从架构和集群架构的介绍及搭建

一、主从和集群架构的特点 1.1 主从架构的-Master/slave模式特点 读写分离,纵向扩展,所有的写操作一般在master上完成,slave只提供一个热备 1.2 集群架构-Cluster模式特点 分布式的一种存储,水平的扩展,消息的分布…

CCleaner怎么清理软件缓存 CCleaner清理要勾选哪些 ccleanerfree下载

CCleaner软件是一款优秀的数据清理软件,其中没有硬盘和内存的设置,也不含任何广告软件,其出色的注册表清洁功能能够保证您的电脑更稳定运行。本文将围绕CCleaner怎么清理软件缓存,CCleaner清理要勾选哪些的相关内容进行介绍。 一、…

计算机网络——DNS协议

目录 前言 前篇 引言 IP地址与域名 DNS协议的工作流程 DNS服务器节点之间是如何维护上下级关系的 前言 本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结,讲的非…

将本地项目上传到Github

首先安装git、创建github账号 1、创建一个新的仓库 2、创建SSH KEY。先看一下你C盘用户目录下有没有.ssh目录,有的话看下里面有没有id_rsa和id_rsa.pub这两个文件,有就跳到下一步,没有就通过下面命令创建。 ssh-keygen -t rsa -C "you…

面试算法-174-二叉树的层序遍历

题目 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 解 class Solut…

代码随想录Day41:动态规划Part3

Leetcode 343. 整数拆分 讲解前: 毫无头绪 讲解后: 这道题的动态思路一开始很不容易想出来,虽然dp数组的定义如果知道是动态规划的话估摸着可以想出来那就是很straight forward dp定义:一维数组dp[i], i 代表整数的值&#xf…

ubuntu,curl(56):openssl ssl_read:error:0A000126:报错

解决方案: SSL/TLS版本过期:服务器可能使用的是curl不支持的过期的SSL/TLS版本。您可以尝试使用--tlsv1.2或--tlsv1.3选项来强制curl使用特定版本的SSL/TLS。例如:curl --tlsv1.2 https://example.com。 无效的SSL/TLS证书:服务器…

pyqt QToolBar 选中高亮

目录 效果图 示例代码 效果图 示例代码 from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QToolBar, QToolButtonclass HighlightingToolButton(QToolButton):def __init__(self, parentNone):super().__init__(parent)self.setCheckable(True)def nextChe…

提升论文写作效率:ChatGPT的妙用

ChatGPT无限次数:点击直达 提升论文写作效率:ChatGPT的妙用 在当今信息爆炸的时代,高效撰写论文成为许多从事学术研究的人士面临的一项重要挑战。传统的论文写作过程繁琐耗时,然而,随着人工智能技术的不断发展,ChatGP…

ins视频批量下载,instagram批量爬取视频信息

简介 Instagram 是目前最热门的社交媒体平台之一,拥有大量优质的视频内容。但是要逐一下载这些视频往往非常耗时。在这篇文章中,我们将介绍如何使用 Python 编写一个脚本,来实现 Instagram 视频的批量下载和信息爬取。 我们使用selenium获取目标用户的 HTML 源代码,并将其保存…

尚鼎环境科技诚邀您参观2024第13届生物发酵展

参展企业介绍 尚鼎环境科技(江苏)有限公司设立于2010年,公司坐落于江南平原南端素有『苏北门户』之称的古城扬州,办公室位在江苏省扬州市邗江区高新技术创业服务中心。 尚鼎环境科技长年致力于食品精炼/环境工程领域全程技术服务,工程实绩遍…

OpenHarmony南向开发案例:【智能体重秤】

一、简介 本demo基于OpenHarmony3.1Beta版本开发,该样例能够接入数字管家应用,通过数字管家应用监测体重秤上报数据,获得当前测量到的体重,身高,并在应用端形成一段时间内记录的体重值,以折线图的形式表现…

html公众号页面实现点击按钮跳转到导航

实现效果&#xff1a; 点击导航自动跳转到&#xff1a; html页面代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>跳转导航</title><meta name"keywords" conten…

华为框式交换机S12700E系列配置CSS集群

搭建集群环境 a.为两台交换机上电&#xff0c;按照数据规划分别对两台框式交换机进行配置 <HUAWEI> system-view [HUAWEI] sysname Switch1 [Switch1] set css id 1 [Switch1] set css priority 150 //框1的集群优先级配置为150 [Switch1] interface css-port 1 [Sw…

36-2 shiro越权 - shiro越权介绍

一、Apache Shiro 简介 Apache Shiro 是一个强大且易用的 Java 安全框架,负责执行身份验证、授权、密码和会话管理。无论是最小的移动应用程序还是最大的网络和企业应用程序,都可以通过使用 Shiro 的 API 快速、轻松地实现安全功能。 二、Shiro权限绕过原因 Apache Shiro 是…

java的深入探究JVM之内存结构

前言 Java作为一种平台无关性的语言&#xff0c;其主要依靠于Java虚拟机——JVM&#xff0c;我们写好的代码会被编译成class文件&#xff0c;再由JVM进行加载、解析、执行&#xff0c;而JVM有统一的规范&#xff0c;所以我们不需要像C那样需要程序员自己关注平台&#xff0c;大…

树莓派安装python3.6,多版本共存

打开终端或 SSH 连接到您的树莓派。 首先,确保您的树莓派已经更新到最新的软件包列表和依赖项。运行以下命令进行更新: sudo apt update sudo apt upgrade接下来,安装 Python 3.6 的依赖项。运行以下命令来安装构建 Python 所需的工具和库: sudo apt install build-essenti…