【GoLang】Go语言几种标准库介绍(三)

news/2024/7/24 2:42:33 标签: golang, 网络, 开发语言

文章目录

      • 前言
      • 几种库
        • debug 库 (各种调试文件格式访问及调试功能)
          • 相关的包和工具:
          • 示例
        • encoding (常见算法如 JSON、XML、Base64 等)
          • 常用的子包和其主要功能:
          • 示例
        • flag(命令行解析)
          • 关键概念:
          • 示例
          • 示例执行
      • 总结
      • 专栏集锦
      • 写在最后

579a429daf314744b995f37351b46548

前言

上一篇,我们介绍了container、crypto、database三个库,这篇我们继续介绍剩下的库


几种库

debug 库 (各种调试文件格式访问及调试功能)

在 Go 语言的标准库中,并没有一个名为 debug 的独立库。

然而,Go 提供了一系列的工具和包,用于调试和性能分析。

这些工具和包包括 debug/pprofruntime/pprofnet/http/pprof 等,用于生成和分析性能剖析数据。

相关的包和工具:
  1. runtime/pprof 提供了运行时性能分析的功能,可以用于查看 CPU 和内存的使用情况。它通过在代码中插入特殊的语句来收集性能数据。
  2. net/http/pprof 提供了 HTTP 接口,用于在运行时进行性能分析。可以通过浏览器或使用 go tool pprof 工具来查看分析结果。
  3. debug/pprofnet/http/pprof 提供了基础的实现,可以方便地将性能分析数据暴露为 HTTP 端点。
示例

net/http/pprof 包的示例

package main

import (
	_ "net/http/pprof"
	"net/http"
	"time"
)

func main() {
	// 启动 HTTP 服务
	go func() {
		http.ListenAndServe(":6060", nil)
	}()

	// 示例业务逻辑
	for {
		work()
		time.Sleep(time.Second)
	}
}

func work() {
	// 模拟业务逻辑
	for i := 0; i < 1000; i++ {
		_ = i * i
	}
}

在这个示例中,通过导入 _ "net/http/pprof" 来注册 net/http/pprof 包的 HTTP 处理器。

然后,通过 http.ListenAndServe 在后台启动一个 HTTP 服务,监听在 localhost:6060 地址上。

这样,我们可以在浏览器中访问 http://localhost:6060/debug/pprof/,查看性能分析数据。

encoding (常见算法如 JSON、XML、Base64 等)

在 Go 语言的标准库中,encoding 包提供了对各种数据编码和解码的支持。

这个包包括了常见的数据编码格式,如 JSON、XML、Base64 等。

encoding 包中的子包主要包括 encoding/jsonencoding/xmlencoding/base64 等。

常用的子包和其主要功能:
  1. encoding/json 用于 JSON 格式的编码和解码。支持将 Go 数据结构转换为 JSON 格式的字符串,以及将 JSON 格式的字符串解码为 Go 数据结构。
  2. encoding/xml 用于 XML 格式的编码和解码。支持将 Go 数据结构转换为 XML 格式的字符串,以及将 XML 格式的字符串解码为 Go 数据结构。
  3. encoding/base64 用于 Base64 编码和解码。支持将数据进行 Base64 编码,以及将 Base64 编码的数据解码为原始数据。
示例

使用 encoding/json 包将 Go 结构体编码为 JSON 格式的字符串,以及将 JSON 格式的字符串解码为 Go 结构体

package main

import (
	"encoding/json"
	"fmt"
)

// 定义一个结构体
type Person struct {
	Name  string `json:"name"`
	Age   int    `json:"age"`
	City  string `json:"city"`
}

func main() {
	// 创建一个 Person 对象
	person := Person{
		Name: "John Doe",
		Age:  30,
		City: "New York",
	}

	// 将结构体编码为 JSON 格式的字符串
	jsonData, err := json.Marshal(person)
	if err != nil {
		fmt.Println("Error encoding JSON:", err)
		return
	}

	// 打印 JSON 数据
	fmt.Println("JSON Data:", string(jsonData))

	// 将 JSON 格式的字符串解码为结构体
	var decodedPerson Person
	err = json.Unmarshal(jsonData, &decodedPerson)
	if err != nil {
		fmt.Println("Error decoding JSON:", err)
		return
	}

	// 打印解码后的结构体
	fmt.Printf("Decoded Person: %+v\n", decodedPerson)
}

在这个示例中,定义了一个名为 Person 的结构体,然后使用 json.Marshal 将该结构体编码为 JSON 格式的字符串,再使用 json.Unmarshal 将 JSON 格式的字符串解码为 Person 结构体。

这种方式非常适用于在网络传输或存储数据时,需要进行数据编码和解码的场景。

flag(命令行解析)

在 Go 语言的标准库中,flag 包提供了一种简单的命令行参数解析方式,用于处理命令行输入的参数。

通过 flag 包,你可以方便地定义和解析命令行标志,而不需要手动解析命令行参数。

关键概念:
  1. Flag: 表示命令行标志,可以是布尔型、整型、浮点型、字符串型等。
  2. Command Line Arguments: 是程序执行时传递给程序的参数。这些参数通常以标志(flag)的形式出现,例如 -name=value
  3. Flag Set: flag 包中的 FlagSet 类型,用于表示一组命令行标志的集合。
示例
package main

import (
	"flag"
	"fmt"
)

func main() {
	// 定义命令行标志
	var name string
	var age int
	var married bool

	flag.StringVar(&name, "name", "John Doe", "Specify the name")
	flag.IntVar(&age, "age", 30, "Specify the age")
	flag.BoolVar(&married, "married", false, "Specify marital status")

	// 解析命令行参数
	flag.Parse()

	// 打印解析后的值
	fmt.Println("Name:", name)
	fmt.Println("Age:", age)
	fmt.Println("Married:", married)
}

在这个示例中,我们使用 flag 包定义了三个命令行标志:nameagemarried

然后,通过 flag.StringVarflag.IntVarflag.BoolVar 分别为这些标志绑定变量。最后,通过 flag.Parse 解析命令行参数,并打印解析后的值。

示例执行
go run main.go -name=Alice -age=25 -married=true

在执行时,在命令行中指定 -name-age-married 等标志,程序会解析这些标志的值,并输出相应的结果。


总结

这里我们介绍了2个库debug、encoding、flag, 下一篇我们将介绍其他的几种标准库


专栏集锦

大佬们可以收藏以备不时之需:

Spring Boot 专栏:http://t.csdnimg.cn/peKde

ChatGPT 专栏:http://t.csdnimg.cn/cU0na

Java 专栏:http://t.csdnimg.cn/YUz5e

Go 专栏:http://t.csdnimg.cn/Jfryo

Netty 专栏:http://t.csdnimg.cn/0Mp1H

Redis 专栏:http://t.csdnimg.cn/JuTue

Mysql 专栏:http://t.csdnimg.cn/p1zU9

架构之路 专栏:http://t.csdnimg.cn/bXAPS


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

csdn-end


http://www.niftyadmin.cn/n/5297607.html

相关文章

U4_3 语法分析-自底向上分析-LR0/LR1/SLR分析

文章目录 一、LR分析法1、概念2、流程3、LR分析器结构及分析表构造1&#xff09;结构2&#xff09;一些概念 二、LR(0)分析法1、流程2、分析动作1&#xff09;移近2&#xff09;归约(reduce) 3、总结1&#xff09;LR分析器2&#xff09;构造DFA3&#xff09;构造LR(0)的方法(三…

【每日一题】一周中的第几天

文章目录 Tag题目来源解题思路方法一&#xff1a;模拟 写在最后 Tag 【模拟】【数学】【2023-12-30】 题目来源 1185. 一周中的第几天 解题思路 方法一&#xff1a;模拟 思路 题目中的日期是在 1971 到 2100 年之间的有效日期&#xff0c;即 1971-01-01 到 2100-12-31 范围…

Java集合/泛型篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、说说LinkHashSet( HashSet+LinkedHashMap)二、HashMap(数组+链表+红黑树)三、说说ConcurrentHashMap前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通…

今天来讲解一下JavaScript中的代理与反射(又是一个小知识速速收藏)

JavaScript 中的代理&#xff08;Proxy&#xff09;和反射&#xff08;Reflect&#xff09;是两个强大的功能&#xff0c;它们允许您在操作对象时拦截、修改或扩展其行为。这两个功能通常一起使用&#xff0c;以实现高度的控制和元编程能力。下面分别介绍代理和反射的概念和用法…

解算人生--写于2023跨年之夜

最近买了一本书&#xff0c;书名叫《计算》 读了部分内容&#xff0c;虽然理解上还需要再下下功夫&#xff0c;但是直观的感觉冲击还是挺大的&#xff0c;最明显的就是表面与本质的把握。大家可能都有这样一种感觉&#xff0c;初步涉足某一领域时&#xff0c;开始我们都会被大量…

nc不支持-e时的反弹

如果你想要使用nc反弹shell&#xff0c;但是不能使用-e选项&#xff0c;你可以尝试以下的替代方法&#xff1a; 使用mkfifo或mknod命令创建一个命名管道&#xff0c;然后使用cat命令读取管道中的内容&#xff0c;并将其传递给/bin/sh执行&#xff0c;再将输出重定向到nc连接。…

【Leetcode】1154. 一年中的第几天

文章目录 题目思路代码 题目 1154. 一年中的第几天链接 思路 题目要求是给定一个字符串 date&#xff0c;它代表一个日期&#xff0c;采用标准的 YYYY-MM-DD 格式。需要计算这个日期是当年的第几天。 首先&#xff0c;我们可以通过字符串的索引来提取年、月和日的数值&…

Linux网络编程学习心得.4

1.epoll工作模式 水平触发 LT 边沿触发 ET 因为设置为水平触发,只要缓存区有数据epoll_wait就会被触发,epoll_wait是一个系统调用,尽量少调用 所以尽量使用边沿触发,边沿出触发数据来一次只触发一次,这个时候要求一次性将数据读完,所以while循环读,读到最后read默认带阻塞…