前言
在 上一章 介绍了GoLang的基础语法,本章节一起来了解下资源包的引入与使用
一、引入
、单条
import "package"
、多条
import (
"package1"
"package2"
"packageN"
)
二、扩展包
内置
,testing
作用:常用于单元测试
,准备工作
,新建文件夹用于存放测试文件
,该文件夹下的包名不能是main (package main)
,文件名结尾必须为 _test.go
,函数命名规范
,普通单元测试,函数名以Test开头
,性能测试 函数名称以Benchmark开头
,目录下面函数名不要重名
,接受一个 *testing.T 的参数
,具体命令
,指定文件测试
go test -v xxx_test.go
,指定某一个函数
go test -v xxx_test.go -run TestFunc
,e g
package tests
import "testing"
func TestAgeSum(t *testing.T) {
}
,fmt
作用:用于字符的格式化,打印操作
,encoding/json
作用:json 序列化操作
attention:
,json.unMarshal() ,当数据源是map且value类型是interface{}时,数据源value类型会发生变化,如下:
Bool 对应JSON布尔类型
float64 对应JSON数字类型
string 对应JSON字符串类型
[]interface{} 对应JSON数组
map[string]interface{} 对应JSON对象
nil 对应JSON的null
为解决 数字类型转换后为float64、 数字值精确度问题可使用如下方法,int类型最终结果为json.number
jsonStr := ""
infoMap := make(map[string]interface{})
// strings.NewReader() -- 创建一个[]bytes的数据
dec := json.NewDecoder(strings.NewReader(jsonStr))
dec.UseNumber()
dec.Decode(&infoMap)
,slice | map change json
jsonstring,err := json.Marshal(slice | map | array)
,json change slice | map | array
changeRes := make(map[string]interface{})
err := json.Unmarshal(strByte, &changeRes)
paramA:The string of operator
paramB:change res
,string change []byte
byteStr := []byte(str)
,json.number convert int64 | float64 | string
jsonNumber := 1
jsonNumber.(json.number).int64() | .float64() | string()
,time
作用:获取日期类扩展
,get current date
time.Now()
,get current timestamp
time.Now().unix()
,timestamp change date
timestamp must int64
the format("2006-01-02 15:04:05") is standard and cannot be replaced (该格式是标准的不能被替换)
time.unix(timestamp, 0).format("2006-01-02 15:04:05")
,date change timestamp
err 可忽略用_替代
times, err := time.ParseinLocation('2006-01-02 15:04:25', date)
timestamp := times.Unix()
,create timer(NewTicker)
time.NewTicker(d Duration)
return *ticker
,get
☆,time.Duration(Num int)
计算时间差值,常用于时间计算,例如设置缓存时间(redis 字符时间)
,get local time zone (获取本地时区信息)
time.Local
return *time.Location (返回至正类型)
,strings
作用:字符串函数
,strings join
按照指定的分隔符将切片(类型必须为字符)分割
strings.join(stringSlice, operator)
,string replace
strings.replace(str, old, new, num)
str -- 字符
old -- 被替换的字符
new -- 替换后的字符
num -- 替换个数(-1 <=> 全部)
,string all replace
strings.ReplaceAll(strings, old, new)
str -- 字符
old -- 被替换的字符
new -- 替换后的字符
,str tolower
strings.ToLower()
,clear special str in strings
strings.TrimLeft(strings, special str)
return string
,check strings is have specify str
strings.HasPrefix(strings, specify str)
return bool
,del specify str in strings prefix
strings.TrimPrefix(strings, specify str)
,str split
strings.split(strings, separationstr)
return slice
,str Repeat
strings.Repeat('strings', repeatNum)
return strings
,str.LastIndex("strings", 'find str')
get findstr last index to appear,if not found return -1 (返回字符在字符串中最后出现的下标【下标从0开始】,如果找不到返回-1)
,strings.index("strings", "find-str")
get findstr first index to appear,if not found return -1 (返回字符在字符串中第一次出现的下标【下标从0开始】,如果找不到返回-1)
,strings.Contains("strings", "str")
return bool(exists true | not exists false)
str is exists in strings (str 是否在strings中存在)
,create []bytes data
return new reader byte
strings.NewReader("string")
,os
作用:用于操作系统函数
,exec quit (执行中断)
os.Exit()
,create mkdir | file
t,err := os.Create(path)
t -- 操作成功返回文件对象可操作的IO
,stat(path)
获取文件信息
finfo, err := os.stat(path)
,IsNotExist(err)
异常信息中是否包含文件不存在的信息,
return
是 -> true || 否 -> false
os.IsNotExist(err)
,Getwd()
获取当前工作目录的根路径
path, err := os.Getwd()
,args
获取命令行传入的参数
os.args
,path
对斜杠分隔的路径进行相关操作
,path.ext()
返回文件的扩展名(带.)
,crypto/md5
md5字符加密
,md5.new()
一个新的使用MD5校验的hash.Hash接口
eg:
md5 字符加密
h := md5.new()
h.Write([]byte(str))
hex.EncodeToString(h.Sum(nil))
,encoding/hex
作用:hex包实现了16进制字符表示的编解码
,hex.EncodeToString([]byte)
将数据src编码为字符串s。
,encoding/csv
作用:csv导入导出方法
attention:
当数据中有 ,(英文逗号) 不会隔开单元格
,knowledge
,csv.NewWriter(f)
f -- 文件I/O
返回一个写入w的 *writer
,csv.WriterAll(data)
data -- 切片
data := [][]string{
{"1", "aaa"},
{"2", "aba"},
{"3", "aca"},
}
使用write 方法向w写入多条记录,并在最后调用flush方法清空缓存
,e g
// 导出csv
var savePath string = "D:/test.csv"
f, err := os.Create(savePath)
if err != nil {
fmt.Println("aa")
}
defer f.Close()
// 设置字符格式(utf-8),防止乱码
f.WriteString("\xEF\xBB\xBF")
w := csv.NewWriter(f)
data := [][]string{
{"1", "小明", ",", "cc"},
{"1", "小猪", ",", "dd"},
{"1", "小狗", "aa", "bb"},
}
w.WriteAll(data)
// 导入
,bytes
,bytes,Split(sourceByte,operatorByte)
将字节切片分割按照特定的格式进行分割,如果operatorByte为空则将愿字节切片最小单元分割
return 二维子切片,其中每个子切片为分割后的部分
sourceByte := []byte("hello,world,this,is,Go")
operatorByte := []Byte(",")
// 将切片sourceByte以operatorByte为分隔符进行分隔
bytes.Split(sourceByte, operatorByte)
,IO
,file assignment(文件赋值)
将src的内容赋值到dist
io.copy(dist, src)
dist -- 文件IO对象
src -- 文件资源
,ioutil
,create tmp file
ioutil.TempFile("dir", "prefix")
param
dir -- tmp file save dir (if dir is null default os.TempDir())
临时文件保存的地址、如果不填默认为 os.TempDir() 返回的地址
prefix -- file prefix
return
f *os.File, err error
,net/url
url 解析、转义相关
,url query param init
param := url.Values{}
,add url query param
// 区分大小写
param.Add("key", "value")
,url query param format
// key=value1&key2=value2
param.Encode()
,net/http
作用:http请求相关
,create router
mux := http.NewServeMux();
,register handle func
// if you do not use default router so http update mux(create router)
// 如果不使用默认路由器那么http更新为创建的路由器
http.HandleFunc("request_path", _handleFunc)
// handlefunc must have two param (注册的函数必须有如下2个)
func _handleFunc(response *http.Response1Write, request *http.Request){
}
,listen tcp addr and call server method connect (监听tcp地址并且调用server方法连接)
// paramA -- port
// paramB -- nil (default router) || create router 【默认路由器 || 创建的路由器】,
http.ListenAndServe(":port", nil)
,request *http.request about
,get url path (does not contain domain)
request.URL
,get header
request.header
,get host
request.host
, get remoteaddr
remoteAddr := request.RemoteAddr
,get get-request all param(type = map)
queryParam := request.URL.Query()
,get get-request only param
value := request.URL.Query().Get("key")
,get post-request param
value := request.PostFormValue("key")
,get file resource
files, fileInfo, err := request.FormFile("file")
files --
fileinfo -- file info
err -- error
,get filename
filename = fileinfo.Filename
size = fileinfo.Size
,respons e*http.ResponseWrite about
,set header
response,Header(),Set("key", "value")
,write content
response,write(content)
,? golang.org/x/sync/singleflight
,?singleflight.Do()
,reflect
作用:运行字符反射、类型获取
// 自定义结构体
type MyStruct struct {
Name string
Age int
}
var s Mystrict = MyStruct{Name: "Alice", Age: 30}
// 获取结构体中的变量
var tagVal = reflect.Typeof(s)
// 获取结构体中变量对应的值
var Val = reflect.Valueof(s)
// 获取结构体中某一个变量的类型
var types = tagVal.Field(index).Type
// 获取结构体中某一个val的值【可能在末尾需要加.interface】
var vals = Val.Field(index)
// 结构体类型
var structType = reflect.struct
github–扩展
,Gin - 框架
github.com/gin-gonic/gin
,detail
, c *gin.Context
,c.Abort()
中间件方法中中断执行
,c.Next()
程序继续执行
,c.Recover()
常用于中间件扩展,用于捕捉 panic() 抛出的信息
,c.Request.URL.Path
get have not domain request path (获取不包含域名的请求路径)
,c.Request.URL.Query()
get query param
,c.Request.Request.PostForm
get body-post param
attention:
you must declare c.Request.ParseForm() before useing
,c.Param()
get url path params (获取url路径中的参数)
e g:
router rule://app/*proxyPath
url:/app/v1/user/list
get path
// 获取到的值为 v1/user/list
c.Param("proxyPath")
,c.Get()
get context val (获取上下文定义的值)
,c.Request.Body
get http body (获取http body请求体)
,gorm (数据库操作)
go get -u gorm.io/gorm
,http-router
github.com/julienschmidt/httprouter
,detail
代理任意路由除关键字外均可变
关键词:*proxyPath
router.Any("*proxyPath", funcName)
,mysql
github.com/go-sql-driver/mysql
,go-redis
github.com/redis/go-redis/v9
,detail
,connection
addr := fmt.Sprintf("%s:%d", ip, port)
rdb := redis.Newclient(&redis.Options{
Addr:addr,
Password:password,
DB:0
})
,set expire string
// attention: when setting an expire time, time must be useed time.Duration conversion
expireUnixTime := time.Duration(time) * time.Second
_, err := rdb.SetEx(ctx, key, string, expireUnixTime)
,get string
val, err := rdb.Set(ctx, key).Result()
,go-kafka
github.com/segmentio/kafka-go
,gocsv
github.com/gocarina/gocsv
,excelize/v2
go get github.com/xuri/excelize/v2
,import
// excel import
// read file
f, err := excelize.OpenFile("filename")
if err != nil {
fmt,Println("read file failed")
}
// close file
defer func (){
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
sheetName := "sheet1"
// GET a only sheetCell
cell, err := f.GetCellValue(sheetName)
if err != nil{
fmt.Println(err)
}
fmt.Println(cell)
// GET a sheet all cell
rows, err := f.GetRows(sheetName)
if err != nil{
fmt.Println(err)
}
for index, infoSlice := range rows {
// index -- 下标
// infoSlice -- 切片
}
,export
// excel export
// create new file
f := excelize.NewFile()
// close
defer func (){
if err := f.Close(); err != nil {
return err
}
}
// create a sheet
sheetName = "sheet1"
// index => 创建sheet的下标
index,err := f.NewSheet(sheetName)
// set cells val
// cell_num => 单元格编号
// cell_val => 单元格值
f.SetCellValue(sheetName, "cell_num", "cell_val")
// merge cells(合并单元格)
// start_cell_num => 合并开始的单元格编号
// end_cell_num => 合并结束的单元格编号
f.MergeCell(sheetName, "start_cell_num", "end_cell_num")
// set default sheet
f.SetActiveSheet(index)
// file save
if err := f.SaveAs("save_file_name.xlsx"); err != nil {
fmt.println(err)
}
,github.com/spf13/viper
用于加载自定义的配置文件
go get gopkg.in/yaml.v3
,go.uber.org/zap
go get -u go.uber.org/zap
,gopkg.in/yaml.v3
go get github.com/spf13/viper
,github.com/avast/retry-go/v4
重试机制库
go get github.com/avast/retry-go/v4
二、使用步骤
1.引入库
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
总结
Golang系列
Golang 之 环境安装
Golang 之 初识
Golang 之 常见用法