[go]byte类型, string 类型, json 类型

简介: 本文介绍了Go语言中byte类型的基本概念、特点及用法。byte是8位无符号整数,取值范围为0-255,常用于二进制数据操作,如网络通信和文件读写。文章还详细说明了byte与字符串的转换、遍历byte数据以及与其他类型间的转换。此外,探讨了Go中json.Marshal和json.Unmarshal函数实现[]byte与JSON间的转换,并对比了[]byte与JSON的区别,帮助开发者更好地理解其应用场景与差异。

在Go语言中,byte类型是一个[基本的数据类型],表示8位的无符号整数。

一个 byte 是由 8 个比特(bit)组成的。比特bit是计算机中最小的信息单位,只能存储 0 或 1。

因此,一个 byte 可以表示的最大数值是通过将 8 个比特的所有可能组合加在一起来计算的。

总之,byte 类型的取值范围 0-255 是基于其二进制表示(8 个比特)的直接结果,这使得它成为计算机中存储和处理小量数据的一种高效方式。

byte类型通常用于存储和操作二进制数据,例如网络通信、文件读写等场景。

byte类型的特点

arduino

代码解读

复制代码

byte类型的值范围为0255,可以表示256个不同的数值。
byte类型在内存中占用1个字节的空间。
byte类型是无符号的,不能表示负数。

byte类型的用法

在Go语言中,我们可以使用byte类型来操作二进制数据。 常见的用法包括:

字符串与byte类型的转换

通过[]byte类型的切片可以将字符串转换为byte类型的数据。

使用string()函数可以将byte类型的数据转换为字符串。

go

代码解读

复制代码


package main

import "fmt"

func main() {
	str := "Hello, World!"  // 这是字符串类型
	bytes := []byte(str)     // 把字符串,转成[]byte类型
	fmt.Println(bytes) // [72 101 108 108 111 44 32 87 111 114 108 100 33]
	
	str2 := string(bytes)  // 使用 string()函数,可以把byte类型,再转成字符串类型
	fmt.Println(str2) // Hello, World!
}

遍历byte类型的数据

go

代码解读

复制代码

可以使用for循环遍历byte类型的数据。

package main

import "fmt"

func main() {
	str := "Hello, World!"
	bytes := []byte(str)  // 把字符串类型,转成 byte 类型
	
	for _, b := range bytes {
		fmt.Printf("%c ", b) // H e l l o ,   W o r l d !
	}
}

和其他类型之间的转换

可以使用byte()函数将其他类型的数据转换为byte类型,也可以使用int()函数将byte类型的数据转换为整数。

go

代码解读

复制代码

package main

import "fmt"

func main() {
	var a byte = 'A'
	fmt.Println(a) // 65
	
	b := byte(97)
	fmt.Println(b) // 97
}

在 golang 开发中, 为什么在很多地方,都需要把其他类型的变量转成 byte 类型

在 Go 语言中,将某些类型的变量转换为 byte 类型通常有几个原因,这些原因主要涉及到性能优化、数据处理、内存管理以及满足特定接口或函数参数的需求。

  1. 性能优化
  • byte 类型是 uint8 的别名,表示 0 到 255 之间的整数。在处理大量的小整数或者二进制数据时(如文件读取、网络传输、图像处理等),使用 byte 类型可以优化内存使用和访问速度。因为 byte 类型的尺寸固定(1 字节),并且很多底层的系统调用和库函数都是基于字节进行操作的。
  1. 数据处理
  • 在处理文本、图像、视频等二进制数据时,经常需要将它们转换成 byte 切片([]byte)来进行操作。这是因为这些数据在底层都是以字节的形式存储的。通过 byte 切片,可以方便地访问和修改这些数据的每一个字节。
  • 在进行加密、解密、压缩、解压缩等操作时,也通常需要先将数据转换为 byte 切片,因为这些操作都是在字节层面上进行的。
  1. 内存管理
  • 使用 byte 类型(以及 []byte)可以帮助 Go 的垃圾回收器(GC)更有效地管理内存。由于 byte 类型的尺寸固定,GC 可以更容易地追踪和回收相关内存。
  • 在处理大量数据时,使用 byte 切片可以避免不必要的内存分配和复制,从而提高性能。
  1. 满足接口或函数参数的需求
  • Go 语言中有很多标准库和第三方库都提供了基于 byte 类型的接口或函数参数。例如,io.Readerio.Writer 接口就是基于 byte 切片进行操作的。如果你需要实现这些接口或者调用这些函数,就需要将你的数据转换为 byte 类型。
  1. 简化类型转换
  • 在处理数据时,有时需要将整数、浮点数等类型转换为字节形式进行存储或传输。将变量转换为 byte 类型可以简化这一过程,并且使代码更加清晰易懂。

总之,将某些类型的变量转换为 byte 类型在 Go 语言中是一种常见且有用的做法,它可以帮助我们更好地处理数据、优化性能、满足接口或函数参数的需求等。然而,也需要注意不要滥用类型转换,以免引入不必要的复杂性或性能问题。

json 类型是什么, json 类型和 byte 类型的区别

json.Marshal()函数

函数接受一个interface{}类型的参数v,并返回一个[]byte类型的字节切片和一个error类型的错误。通过调用该函数,可以将v序列化为JSON格式的字符串。

接下来,我们来看一个具体的代码示例。假设我们有一个结构体Person,定义如下:

我们想要将该结构体转换为JSON格式的字符串。示例代码如下:

go

代码解读

复制代码

package main

import (
"fmt"
"log"
"encoding/json"
)


type Person struct {
    Name string `json:"name"`
    Age int `json:"age"`
}

func main() {
   p:= Person("Alice", 10)
   
   b, err:= json.Marshal(p)
   
   if err != nil {
      log.Println(json序列化失败)
   }
    log.Println(string(b))
   
}

在以上代码中,我们首先创建了一个Person类型的对象p,并初始化其Name和Age属性。 然后,调用json.Marshal函数将p对象,序列化为JSON格式的字符串。如果序列化成功,将返回一个字节切片b和一个nil错误。

我们可以通过调用string(b)将字节切片转换为字符串,并使用fmt.Println打印结果。

编译并运行以上代码,可以得到如下输出:

{"name":"Alice","age":25}

从输出结果中可以看出,结构体Person已经被成功序列化为JSON格式的字符串。

需要注意的是,json.Marshal函数只会序列化结构体中被导出的字段(首字母大写)。 如果某个字段没有被导出,将无法被序列化。

此外,如果结构体中的字段具有标签(即json:"..."),将按照标签的定义来进行序列化。在示例代码中,我们为Name和Age字段添加了json标签,指定JSON字符串中对应的字段名。这样做可以确保JSON序列化时字段名的一致性。

总结起来,通过学习和理解Go语言文档中json.Marshal函数的使用方法,我们可以很方便地将Go语言中的数据结构序列化为JSON格式的字符串。在实际应用中,我们可以根据需要对json.Marshal函数进行使用和扩展,实现更加复杂的JSON序列化操作。

在Go语言中,可以使用encoding/json包来实现[]byte与JSON之间的转换。

json.Marshal()`函数

javascript

代码解读

复制代码

它接受一个任意类型的值作为参数,返回一个JSON格式的`[]byte`
例如:

golang

代码解读

复制代码

package main
import (
"encoding/json"
"fmt"
)
func main() {
data := []byte("Hello, World!")
jsonData, err := json.Marshal(data)
if err != nil {
fmt.Println("JSON encoding error:", err)
return
}
fmt.Println(string(jsonData))
}
//输出结果为:
//"SGVsbG8sIFdvcmxkIQ=="

json.Unmarshal()`函数

javascript

代码解读

复制代码

它接受一个JSON格式的`[]byte`作为参数,并将JSON解码为相应的Go值。
例如:

golang

代码解读

复制代码

package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonData := []byte(`"SGVsbG8sIFdvcmxkIQ=="`)
var data []byte
err := json.Unmarshal(jsonData, &data)
if err != nil {
fmt.Println("JSON decoding error:", err)
return
}
fmt.Println(string(data))
}
//输出结果为
//Hello, World!

go

代码解读

复制代码

请注意,在使用`json.Unmarshal()`函数时,需要将目标变量的指针作为参数传递给函数。这样才能将解码后的值正确地赋给目标变量。

[]byte和JSON不是同一个意思,它们各自代表了不同的概念和数据处理方式。

1.  []byte

markdown

代码解读

复制代码

-   在许多编程语言中(如Go语言),`[]byte`代表一个字节数组,即一系列字节的集合。
-   它用于处理二进制数据,如文件内容、网络通信中的数据包、图像或音频数据的原始字节等。
-   `[]byte`提供了一种灵活的方式来操作内存中的字节序列,支持读取、写入、修改等操作。

1.  JSON(JavaScript Object Notation)

javascript

代码解读

复制代码

-   JSON是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式来存储和表示数据。
-   JSON易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集,但它是跨语言的,许多编程语言都提供了对JSON的支持(通过内置库或第三方库)。
-   JSON主要由两种结构组成:对象(键值对的集合)和数组(有序的值序列)。
-   JSON数据经常用于Web开发中,作为API的响应格式,用于在客户端和服务器之间传输数据。

主要区别

  • 类型[]byte是一个数据类型(在Go语言中),而JSON是一种数据表示和交换格式。
  • 用途[]byte用于处理二进制数据,而JSON用于在不同系统或程序之间交换结构化的文本数据。
  • 可读性:JSON数据是可读的文本格式,而[]byte通常表示的是原始的二进制数据,不一定具有可读性(除非数据本身就是文本数据)。
  • 处理方式:处理[]byte时,通常会进行字节级别的操作,如读取、写入、加密、解密等。而处理JSON数据时,通常会进行解析、生成、验证等操作,以提取或操作其中的结构化数据。

综上所述,[]byte和JSON在数据处理和表示方面有着明显的区别,它们各自适用于不同的场景和需求。


转载来源:https://juejin.cn/post/7418893729640202259

相关文章
|
1月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
126 3
|
2月前
|
数据安全/隐私保护
【Azure Function App】PowerShell Function 执行 Get-AzAccessToken 的返回值类型问题:System.String 与 System.Security.SecureString
将PowerShell Function部署到Azure Function App后,Get-AzAccessToken返回值类型在不同环境中有差异。正常为SecureString类型,但部分情况下为System.String类型,导致后续处理出错。解决方法是在profile.ps1中设置环境变量$env:AZUREPS_OUTPUT_PLAINTEXT_AZACCESSTOKEN=false,以禁用明文输出。
|
6月前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
155 15
|
6月前
|
算法 Go
Go语言模拟集合类型-《Go语言实战指南》
在 Go 语言中,虽然没有内建的集合(Set)类型,但可以通过 `map` 实现其功能。常用方式包括 `map[T]bool` 和更节省内存的 `map[T]struct{}`。前者以布尔值表示元素存在性,后者利用零内存开销的空结构体。文章介绍了集合的基本操作(添加、删除、判断、遍历),并通过封装示例展示如何创建自定义 Set 类型。这种实现方式适用于去重、唯一标记及集合运算等场景,简洁高效且易于扩展。
|
9月前
|
存储 算法 Go
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。
124 5
|
JSON 安全 前端开发
类型安全的 Go HTTP 请求
类型安全的 Go HTTP 请求
|
12月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
318 4
go语言常量的类型
【10月更文挑战第20天】
112 2
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
195 4
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
122 3

热门文章

最新文章