Golang标准库

Go语言标准库的包在SDK/src下面

官方标准库文档:

doc package - go/doc - Go Packages

OS库

包 os 为操作系统功能提供了一个独立于平台的接口。设计类似于 Unix,尽管错误处理类似于 Go;失败的调用返回错误类型的值而不是错误号。通常,错误中会提供更多信息。例如,如果采用文件名的调用失败,例如 Open 或 Stat,则错误将在打印时包含失败的文件名,并且类型为 *PathError,可以将其解包以获取更多信息。

文件及目录操作:

package main

import (
	"fmt"
	"os"
)

//创建文件
func createFile() {
	f, err := os.Create("go2.txt") //调用os模块的Create创建文件
	if err == nil {
		fmt.Println("FileName:", f.Name())
	} else {
		fmt.Println("err:", err)
	}
}

//创建目录 创建一个目录
func createDir() {
	//调用os.Mkdir 创建单个目录
	err := os.Mkdir("Gooo", os.ModePerm) //os.ModePerm 表示该文件默认读写权限为777
	if err != nil {
		fmt.Println("err:", err)
	} else {
		fmt.Println("Dir Create Success!")
	}
}

//多级创建目录
func createMultistageDir() {
	//调用os.MkdirAll 创建多级目录
	err := os.MkdirAll("GO/123/A/Mek", os.ModePerm) //os.ModePerm 表示该文件默认读写权限为777
	if err != nil {
		fmt.Println("err:", err)
	} else {
		fmt.Println("Multistage Dir Create Success!")
	}
}

//删除
func Remove() {
	//调用os.Remove 删除单个文件
	err := os.Remove("go.txt")
	if err != nil {
		fmt.Println("err:", err)
	}

	//调用os.RemoveAll 删除目录
	err2 := os.RemoveAll("GO")
	if err2 != nil {
		fmt.Println("err:", err)
	}
}

//获得工作目录,同Linux下的pwd命令
func pwd() {
	//调用os.Getwd() 获得工作路径
	d, err := os.Getwd()
	if err != nil {
		fmt.Println("err:", err)
	} else {
		fmt.Println(d)
	}
}

//修改工作目录
func chWd() {
	err := os.Chdir("d:/")
	if err != nil {
		fmt.Println("err:", err)

	} else {
		d, _ := os.Getwd()
		fmt.Println(d)
	}
}

//重命名文件
func reName() {
	//调用os.Rename 修改文件名
	err := os.Rename("1.txt", "go.log")
	if err != nil {
		fmt.Println("err:", err)
	}
}

//读取文件
func readFile()  {
	b,_ :=os.ReadFile("go.log")
	fmt.Println(b)	// [79 75 79 75]	读取结果为二进制切片
	fmt.Println(string(b[:]))		//转换为字符串  OKOK
}

//写入文件
func writeFile()  {
	err := os.WriteFile("go.log",[]byte("Hello Go!"),os.ModePerm)
	if err != nil {
		fmt.Println("err:", err)
	}
}

func main() {
	readFile()
	writeFile()
}

高阶文件操作:

使用Flie结构体对文件进行操作

package main

import (
	"fmt"
	"io"
	"os"
)

//打开只读文件
func readFile() {
	//调用系统os.Open打开文件
	file, err := os.Open("go.log")
	if err != nil {
		fmt.Println("err:", err)
	}
	fmt.Println(file.Name())

	for {		//循环读取
		buf := make([]byte, 2)	//创建缓冲区用于读取字节码
		_, err := file.Read(buf)

		//fmt.Println(read)           //读取字节数
		fmt.Println(string(buf[:])) //打印输出
		if err == io.EOF {
			break
		}

	}
	file.Close() //关闭文件
}

//创建读写对象
func Fileclass() {
	//调用os.OpenFile 创建文件对象,os.O_RDWR 可读可写,os.O_CREATE不存在则创建,755 权限
	file, err := os.OpenFile("go.log", os.O_RDWR|os.O_CREATE, 755)
	if err != nil {
		fmt.Println("err:", err)
	}
	fmt.Println(file.Name())

	//写入操作
	//写入字节码
	file.Write([]byte("hello File!")) //hello File!

	file.Close() //关闭文件

	//os.O_APPEND 追加写入
	openFile, _ := os.OpenFile("go.log", os.O_RDWR|os.O_APPEND, 0777)
	//写入字符串
	openFile.WriteString("Hello Java")	//hello File!Hello Java
	openFile.Close()
}

//读取目录
func readDir()  {
	//用os.ReadDir读取目录,得到一个切片
	dir, err := os.ReadDir("d:/")
	if err != nil {
		fmt.Println("err:", err)
	}else {
		for _,v := range dir{	//循环
			fmt.Println(v.IsDir())		//判断是否为目录
			fmt.Println(v.Name())		//打印文件名
		}
	}
}




func main() {
	Fileclass()
}

Go 标准库io包input output

Go语言中,为了方便开发者使用,将I0操作封装在了如下几个包中:

io为IO原语(U/oprimitives)提供基本的接口os File Reader Writer
io/ioutil封装一些实用的IO函数
fmt实现格式化I/O,类似C语言中的printf和scan fformat fmt
bufio实现带缓冲I/O

Go 标准库log包

Golang内置了log包,实现简单的日志服务。通过调用log包的函数,可以实现简单的日志打印功能。

panic 打印日志,抛出panic异常
fatal 打印日志,强制结束程序,程序内的defer 代码 不会被执行
package main

import (
	"fmt"
	"log"
)

// Panic 抛出异常程序退出
// Fatal 打印日志程序结束

func setLog()  {	//设置输出方式
	fmt.Println(log.Flags())
	log.SetFlags(log.Ldate|log.Ltime|log.Lshortfile) //输出到文件
}

func pan()  {
	log.Panic("9999")
	fmt.Println("END")		//这句话不会被输出
}

func fa()  {
	log.Fatalf("my Log")
	fmt.Println("END")	//这句话不会被输出

}

func main() {
	//log.Println("my log")		//2022/06/13 15:03:18 mylog
	//log.Printf("my log %d",1069)		//2022/06/13 15:03:18 my log 1069
	setLog()
}

Go 标准库bytes

bytes包提供了对字节切片进行读写操作的一系列函数,字节切片处理的函数比较多分为基本处理函数、比较函
数、后经检查函数、索引函数、分割函数、大小写处理函数和子切片处理函数等.

package main

import (
	"bytes"
	"fmt"
)

//转换字节码
func Convert() {
	s1 := "Mek"
	b1 := []byte(s1)
	fmt.Println(b1)
}

//比较是否包含
func Contains() {
	s := "mek.plus" //声明一个字符串
	b := []byte(s)  //转换为byte类型

	b1 := []byte("Mek") //声明一个字符串转换为byte类型
	b2 := []byte("mek")

	b3 := bytes.Contains(b, b1) //比较是否存在,返回结果为bool类型
	fmt.Println(b3)             //false
	b4 := bytes.Contains(b, b2)
	fmt.Println(b4) //true
}

//计数,对象出现几次
func Count() {
	s := []byte("hellooooooo")
	ep1 := []byte("e")
	ep2 := []byte("l")
	ep3 := []byte("o")
	ep4 := []byte("hell")
	fmt.Println(bytes.Count(s, ep1)) //1
	fmt.Println(bytes.Count(s, ep2)) //2
	fmt.Println(bytes.Count(s, ep3)) //7
	fmt.Println(bytes.Count(s, ep4)) //1
}

//替换
func Repeat() {
	b := []byte("mek.mek.plus")
	// 对象 查找模板 替换目标 计数
	fmt.Println(string(bytes.Replace(b, []byte("mek"), []byte("Mek"), 1)))  //Mek.mek.plus
	fmt.Println(string(bytes.Replace(b, []byte("mek"), []byte("Mek"), 2)))  //Mek.Mek.plus
	fmt.Println(string(bytes.Replace(b, []byte("plus"), []byte("org"), 1))) //mek.mek.org
}



func main() {
}

Go 标准库error

errors包实现了操作错误的函数。语言使用eror类型来返回函数执行过程中遇到的错误,如果返回的error值为
nil,则表示未遇到错误,否则error会返回一个字符串,用于说明遇到了什么错误.

package main

import (
	"errors"
	"fmt"
)

func check(s string)(string,error)  {
	if s == ""{
			//通过errors.New 创建一个错误
		err := errors.New("字符串不能为空!")
		return s,err
	}else {
		return s,nil
	}
}


func main()  {
	a := ""
	s, err := check(a)
	if err != nil {	//err: 字符串不能为空!

		fmt.Println("err:",err)
		fmt.Println(s)
	}else {
		fmt.Println(s)
	}

	b := "Mek"
	s1, err1 := check(b)
	if err1 != nil {
		fmt.Println("err:",err1)	//Mek
		fmt.Println(s1)
	}else {
		fmt.Println(s1)
	}
}

Go标准库sort包

sort包的内容,以及使用:

sort包提供了排序切片和用户自定义数据集以及相关功能的函数。
sort包主要针对[]int、[]f1oat64、[]string、以及其他自定义切片的排序。
package main

import (
	"fmt"
	"sort"
)

func main() {
	i := []int{2, 3, 1, 4, 5}
	//调用 Ints() 对切片进行排序
	sort.Ints(i)
	fmt.Println(i) // [1 2 3 4 5]

	s := []string{"波", "泽", "阿", "斯", "菲"}
	//sort.Strings(s)
	//fmt.Println(s) //[斯 波 泽 菲 阿]
	sort.StringsAreSorted(s)
	fmt.Println(s) //[波 泽 阿 斯 菲]

}

Go标准库time

time包提供测量和显示时间的功能。

基本用法
package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()         //获得当前时间
	fmt.Println(now)          //2022-06-14 19:39:41.0934942 +0800 CST m=+0.001020401
	fmt.Println(now.Year())   //年
	fmt.Println(now.Month())  //月
	fmt.Println(now.Day())    //日
	fmt.Println(now.Hour())   //时
	fmt.Println(now.Minute()) //分
	fmt.Println(now.Second()) //秒

}

时间戳
package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()            //获得当前时间
	fmt.Println(now.Unix())      //获得时间戳
	fmt.Printf("%T", now.Unix()) //int64

	unix := time.Now().Unix()

	now2 := time.Unix(unix, 0) //将时间戳转换为时间
	fmt.Println(now2)
}

时间差计算
package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now() //获得当前时间
	fmt.Println(now)
	now22 := now.Add(time.Hour * 24) //加上24小时
	fmt.Println(now22)

	now11 := now.Sub(now22) //减去另一个时间的剩余时间
	fmt.Println(now11)
}

其他操作

时间格式化输出

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now() //获得当前时间
	fmt.Println(now)
	now22 := now.Add(time.Hour * 24) //加上24小时
	fmt.Println(now22)

	//时间格式化输出
	println(now.Format("2006-01-02 03:04:05"))
	println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
	println(now.Format("2006/01/02 03:04:05"))
	println(now.Format("2006/01/02"))
}

字符串转时间

package main

import (
	"fmt"
	"time"
)

func main() {
	//调用time.LoadLocation 获得一个时区
	location, err := time.LoadLocation("Asia/Shanghai")
	fmt.Println(err)

	//调用time.ParseInLocation将字符串还原成时间对象
	//使用方法 时间对象格式化格式,字符串,时间
	inLocation, _ := time.ParseInLocation("2006-01-02 15:04:05", "2012-12-21 14:33:00", location)
	fmt.Println(inLocation)
	println(inLocation.Unix())
}

Go标准库json

这个包可以实现json的编码和解码,就是将json字符串转换为struct(结构体或者MAP),或者将struct转换为json

package main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Name    string
	Age     int
	Address Address
}

type Address struct {
	Road     string
	Street   string
	City     string
	Province string
	Country  string
}

//结构体转json
func test1() {
	Zhang3 := Student{
		Name: "张三",
		Age:  18,
		Address: Address{
			Road:     "renmin south road",
			Street:   "123 street",
			City:     "cs",
			Province: "hn",
			Country:  "CN",
		},
	}
	//调用json.Marshal 传入结构体,返回对象是字节切片
	Info_of_Zhang3, err := json.Marshal(Zhang3)
	if err == nil {
		fmt.Println(string(Info_of_Zhang3))
	} else {
		fmt.Println(err)
		return
	}

}

//字符串转结构体
func test2() {
	s := []byte(`{"Name":"张三","Age":18,"Address":{"Road":"renmin south road","Street":"123 street","City":"cs","Province":"hn","Country":"CN"}}`)
	var s1 Student
	
	//还原为map 声明interface{}		 类型
	var s2 interface{} 

	//将字符串还原为结构体
	err := json.Unmarshal(s, &s1)
	fmt.Println("err:", err)
	fmt.Println(s1) //{张三 18 {renmin south road 123 street cs hn CN}}

	//将字符串还原为map
	err2 := json.Unmarshal(s, &s2)
	fmt.Println("err:", err2)
	fmt.Println(s2) //map[Address:map[City:cs Country:CN Province:hn Road:renmin south road Street:123 street] Age:18 Name:张三]
}

func main() {
	test1()
	test2()
}

Go标准库math

该包包含一些常量和一些有用的数学计算函数,例如:三角函数、随机数、绝对值、平方根等。

常用函数

package main

import (
	"fmt"
	"math"
)

func main() {
	//常量
	fmt.Println(math.MaxFloat64, math.SmallestNonzeroFloat64)
	fmt.Println(math.MaxInt32, math.MinInt32)
	fmt.Println(math.Pi)
	//绝对值  3.14
	fmt.Println(math.Abs(-3.14))
	//2的9次方  512
	fmt.Println(math.Pow(2, 9))
	//十的几次方  1000
	fmt.Println(math.Pow10(3))
	//开平方		8
	fmt.Println(math.Sqrt(64))
	//开立方 	3
	fmt.Println(math.Cbrt(27))
	//取余	100/6 的余数
	fmt.Println(math.Mod(100, 6))
}

随机数

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	//设置随机种子数
	rand.Seed(time.Now().UnixMicro())
	fmt.Println(rand.Int())
	//获得100以内的整数
	fmt.Println(rand.Intn(100))
	//获得一个浮点数
	fmt.Println(rand.Float64())
}