文章目录

  • 打印日志
  • 系统调用命令
  • json的序列化和反序列化
  • base64
  • 压缩和解压
  • 标准输入
  • 文件操作
  • 目录操作
  • init函数
  • 包的可见性
  • 数学库
  • 生成随机数
  • 时间函数



打印日志

go语言标准库源码解析 go语言常用标准库_golang

package main

import (
	"log"
	"os"
)

func logger() {
	log.Printf("%d\n", 5)//打印到控制台
	fout, err := os.OpenFile("my.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, os.ModePerm)//打开一个文件
	if err != nil {
		return
	}
	defer fout.Close()
	//输出一条日志信息到文件中
	logWriter := log.New(fout, "手动添加额外的信息", log.Ldate|log.Lmicroseconds)
	logWriter.Printf("%s\n", "这是一条测试信息")
}
func main() {
	logger()
}

go语言标准库源码解析 go语言常用标准库_字符串_02

系统调用命令

go语言标准库源码解析 go语言常用标准库_golang_03

json的序列化和反序列化

go语言标准库源码解析 go语言常用标准库_字符串_04

type Student struct {
	Name string
	Age  int
}

func main() {
	stu := Student{"hjl", 18}
	bs, _ := json.Marshal(stu)
	fmt.Println(string(bs))
	bs, _ = sonic.Marshal(stu)
	fmt.Println(string(bs))
	var stu1 Student
	err := sonic.Unmarshal(bs, &stu1)
	if err != nil {
		fmt.Printf("错误\n")
		return
	}
	fmt.Println(stu1.Name)
}

go语言标准库源码解析 go语言常用标准库_golang_05

base64

go语言标准库源码解析 go语言常用标准库_json_06


压缩和解压

go语言标准库源码解析 go语言常用标准库_json_07

func compressDemo() error {
	fin, err := os.Open("my.log")
	if err != nil {
		return err
	}
	defer fin.Close()
	stat, _ := fin.Stat()
	fmt.Printf("压缩前文件大小%d B\n", stat.Size())
	//创建一个压缩文件
	fout, err := os.OpenFile("my.zlib", os.O_CREATE|os.O_WRONLY, 0777)
	if err != nil {
		return err
	}
	defer fout.Close()
	bs := make([]byte, 1024)
	writer := zlib.NewWriter(fout)
	//将文件中的内容写到压缩文件中
	for {
		n, err := fin.Read(bs)
		if err == nil {
			writer.Write(bs[:n])
		} else {
			if err == io.EOF {
				break
			} else {
				fmt.Println(err)
				break
			}
		}
	}
	writer.Close()
	fin1, err := os.Open("my.zlib")
	if err != nil {
		return err
	}
	defer fin1.Close()
	stat1, _ := fin.Stat()
	fmt.Printf("压缩后文件大小%d B\n", stat1.Size())
	reader, err := zlib.NewReader(fin1)
	if err != nil {
		return err
	}
	io.Copy(os.Stdout, reader)
	reader.Close()

	return nil
}
func main() {
	compressDemo()
}

go语言标准库源码解析 go语言常用标准库_字符串_08


标准输入

go语言标准库源码解析 go语言常用标准库_随机数_09

文件操作

go语言标准库源码解析 go语言常用标准库_随机数_10

go语言标准库源码解析 go语言常用标准库_golang_11

go语言标准库源码解析 go语言常用标准库_go语言标准库源码解析_12

go语言标准库源码解析 go语言常用标准库_json_13

目录操作

go语言标准库源码解析 go语言常用标准库_随机数_14

go语言标准库源码解析 go语言常用标准库_json_15

func walk(path string) error {
	if subFiles, err := ioutil.ReadDir(path); err != nil {
		return err
	} else {
		for _, file := range subFiles {
			fmt.Println(file.Name())
			if file.IsDir() {
				if err := walk(filepath.Join(path, file.Name())); err != nil {
					return err
				}
			}
		}
	}
	return nil
}
func main() {
	walk(".")
}

go语言标准库源码解析 go语言常用标准库_字符串_16

init函数

只要引入了其他的包,就会在调用main函数之前自动调用这些包中的init函数。

所以init函数可以用来初始化这些包中的一些变量。

go语言标准库源码解析 go语言常用标准库_go语言标准库源码解析_17

如果有多个包,其调用顺序如下:

go语言标准库源码解析 go语言常用标准库_字符串_18

go语言标准库源码解析 go语言常用标准库_字符串_19

包的可见性

go语言标准库源码解析 go语言常用标准库_json_20

go语言标准库源码解析 go语言常用标准库_go语言标准库源码解析_21


数学库

go语言标准库源码解析 go语言常用标准库_go语言标准库源码解析_22

go语言标准库源码解析 go语言常用标准库_golang_23

go语言标准库源码解析 go语言常用标准库_golang_24

生成随机数

go语言标准库源码解析 go语言常用标准库_json_25


go语言标准库源码解析 go语言常用标准库_json_26

如果想要生成真随机数,除了可以传入系统时间作为随机数种子以外:
rand.Seed(time.Now().Unix())
还可以使用 crypto/rand 包中的方法,这样生成的每次都是不同的随机数:

func main() {
	// 生成 10 个 [0, 128) 范围的真随机数。
	for i := 0; i < 10; i++ {
		result, _ := rand.Int(rand.Reader, big.NewInt(128))
		fmt.Println(result)
	}
}

go语言标准库源码解析 go语言常用标准库_go语言标准库源码解析_27


时间函数

go语言标准库源码解析 go语言常用标准库_golang_28

go语言标准库源码解析 go语言常用标准库_go语言标准库源码解析_29

func main() {
	layout := "2006x01x02 15a04a05"
	now := time.Now()            //拿到当前的时间
	nowStr := now.Format(layout) //将当前的时间按照layout的格式转成字符串
	fmt.Println(nowStr)
	fmt.Println(now)
	fmt.Println(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
	<-time.After(3 * time.Second) //sleep三秒

	//将字符串再转回时间类
	loc, _ := time.LoadLocation("Asia/Shanghai")
	fmt.Println(loc)
	if t, err := time.ParseInLocation(layout, nowStr, loc); err == nil {
		fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())
	} else {
		fmt.Println(err)
	}
}

go语言标准库源码解析 go语言常用标准库_随机数_30