go语言中常用的标准库

go中常用标准库

  • go的开发中,经常会使用一些库,把这些库整理出来,方便记忆

系统相关

unsafe:

  • 包含了一些打破 Go 语言“类型安全”的命令,一般的程序中不会被使用,可用在 C/C++ 程序的调用中。
    go语言中常用的标准库_第1张图片

syscall

  • 底层的外部包,提供了操作系统底层调用的基本接口
	//查询操作系统环境变量对应的值,其实就是在 export 命令的结果中查找
	c, _ := syscall.Getenv("GOPATH")
	// Env: /Users/gyk/go
	fmt.Printf("Env: %s\n", c)

os

  • 提供给我们一个平台无关性的操作系统功能接口,采用类 Unix 设计,隐藏了不同操作系统间的差异,让不同的文件系统和操作系统对象表现一致。
  • 常用文件操作的命令如下
	//创建文件
	os.Create("/data/chant/gs/bs.ini")

	//打开文件不存在就创建
	os.OpenFile("a.ini", os.O_CREATE|os.O_WRONLY|os.O_RDONLY, 0666)

	//仅仅打开文件,不存在就打开失败
	os.Open("a.ini")

	//一次性读取文件内容到字节数组
	dd, _ := os.ReadFile("t.ini")
	fmt.Printf("%s\n", string(dd))

	//如果gs目录不存在就创建gs目录
	os.Mkdir("/data/chant/gs", 0750)

	//往文件写入数据
	os.WriteFile("testdata/hello", []byte("Hello, Gophers!"), 0666)

	//返回系统环境变量数组[]string,同 export
	os.Environ()

	//会依次创建所有目录,同 mkdir -p /data/chant/gs
	os.MkdirAll("/data/chant/gs", 0750)

	//获取当前工作目录的路径,同 pwd
	os.Getwd()

	// 返回从命令行获取的所有参数[]string ,编写帮助工具或者其他带参数的脚本时使用
	os.Args

	//强制退出程序
	os.Exit(0)

	//删除文件
	os.Remove("t.ini")
	
	//删除当前目录和子目录下的所有内容
	os.RemoveAll("/data/chant/")

os/exec

  • 提供我们运行外部操作系统命令和程序的方式。
//命令行访问百度
import (
	"os/exec"
)
exec.Command("curl", "https://baidu.com")
//在环境变量(echo $PATH) 的路径中去查找对于文件是否存在
import (
	"fmt"
	"os/exec"
)

path, err := exec.LookPath("go")
	if err != nil {
		//不存在会报错
		//Error: exec: "VERSION": executable file not found in $PATH
		fmt.Printf("Error: %v\n", err)
		return
	}
	//存在会打印出对应文件路径
	// Path: /Users/gyk/go/go1.19.9/bin/go
	fmt.Printf("Path: %s\n", path)

文件操作相关

fmt

  • 提供了格式化输入输出功能。
  • 常用简单的调试函数
	fmt.Printf("格式化字符串并输出控制台: %s, %d,%v,%.2f", "您", 2, []byte("yes"), 22.333332)
	
	fmt.Println("打印字符串并换行")
	
	fmt.Sprintf("格式化字符串并保存到字符串中并返回: %s,%d", "hello", "2023")

io

  • 提供了基本输入输出功能,大多数是围绕系统功能的封装。

bufio

  • 缓冲输入输出功能的封装。

path/filepath

  • 用来操作在当前系统中的目标文件名路径。

flag

  • 对命令行参数的操作。

字符串操作

strings

  • 提供对字符串的操作。

strconv

  • 提供将字符串转换为基础类型的功能。

unicode

  • unicode 型的字符串提供特殊的功能。

regexp

  • 正则表达式功能。

bytes

  • 提供对字符型分片的操作。

数学函数

math

  • 基本的数学函数。

math/cmath

  • 复数的操作。

math/rand

  • 伪随机数生成。

sort

  • 数组排序和自定义集合。

math/big

  • 大数的实现和计算。   
    container-/list-ring-heap: 实现对集合的操作。

list

  • 双链表。

ring

  • 环形链表。

日期时间操作

time

  • 日期和时间的基本操作。

日志

log

  • 记录程序运行时产生的日志。
  • 让log重定向日志文件
package process

import (
	"fmt"
	"os"
	time2 "time"
)

type LogFile struct {
	Filename string
}

func init() {
	lf = LogFile{
		"log.log",
	}
	//设置重定向文件地址
	log.SetOutput(&lf)
}

// 定义日志输出目录,这里是实现Write接口
func (l *LogFile) Write(p []byte) (int, error) {
	rootPwd, _ := os.Getwd()

	rootPwd = rootPwd + "/log/"

	if err := os.Mkdir("log", 0777); err == nil {
		fmt.Printf("日志文件夹创建成功:%v\n", rootPwd)
	}

	time := time2.Now()

	logPrefix := fmt.Sprintf("%4d-%02d-%02d", time.Year(), time.Month(), time.Day())

	f, err := os.OpenFile(rootPwd+logPrefix+l.Filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)

	defer f.Close()

	if err != nil {
		return -1, err
	}

	return f.Write(p)
}

encoding/json

  • 读取并解码和写入并编码 JSON 数据。

encoding/xml:

  • 简单的 XML 解析器。

text/template

  • 生成像 HTML 一样的数据与文本混合的数据驱动模板。

net

  • 网络数据的基本操作。

http

  • 提供了可扩展的 HTTP 服务器和基础客户端,解析 HTTP 请求和回复。

html

  • HTML5 解析器。

runtime

  • go 程序运行时的交互操作。
  • 常用操作
	//设置运行时调用cpu核数
	runtime.GOMAXPROCS(2)
	//返回cpu核心数
	runtime.NumCPU()
	//返回变量GOROOT 路径
	runtime.GOROOT()
	//返回go版本 go1.19.9
	runtime.Version()

反射

reflect

通过程序运行时反射,让程序操作任意类型的变量

type ConfigProcess struct {
	Url       string `ini:"url"`       //请求url
	X         string `ini:"x"`         //请求方式 post or get
	C         int64  `ini:"c"`         //开启协程数量
	N         int64  `ini:"n"`         //每个协程请求次数
	H         string `ini:"h"`         //header设置
	D         string `ini:"d"`         //请求参数设置
	T         int64  `ini:"t"`         //持续压测时间
	Assertion string `ini:"assertion"` //结果断言,字符串查找
}

// config配置参数
type Config struct {
	ConfigProcess `ini:"process"`
}
//通过反射,获取配置struct中的 键值 赋值给 []string,模拟os.Args
func TransferConfig(config *Config) []string {
	k := reflect.TypeOf(config.ConfigProcess)
	v := reflect.ValueOf(config.ConfigProcess)
	var args []string
	args = append(args, "main.go")
	for i := 0; i < k.NumField(); i++ {
		field := k.Field(i)
		value := v.Field(i)
		args = append(args, "-"+strings.ToLower(field.Name))
		switch field.Type.Kind() {
		case reflect.String:
			args = append(args, value.String())
		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
			args = append(args, fmt.Sprintf("%d", value.Int()))
		}
	}
	return args
}

你可能感兴趣的:(go,golang,后端)