文章目录
前言
提示:本章节主要介绍Golang代码常见用法
详情
、捕捉系统信号
捕捉系统中断等信号,常用于定时任务
import (
"os"
"os/signal"
"syscall"
"context"
"fmt"
)
// 创建系统信号通道 且 设置缓冲区为1
systemChan := make(chan os.Signal, 1)
// 定义系统通道 本次能捕获的系统信号【中断(ctrl + c),程序结束(优雅地)】
signal.Notify(systemChan, syscall.SIGINT, syscall.SIGTERM)
// 定义上下文
ctx. cannel := context.WithCancel(context.Background())
// 开启协程,输出systemChan 元素,管理上下文结束程序脚本
go func() {
defer cannel()
<- systemChan
}()
// 模拟手动中断程序【ctrl + c】
// 此处可注释,注释后手动中断程序即可
go func() {
time.Sleep(5 * time.Second)
systemChan <- syscall.SIGINT
}()
// 捕获上下文退出事件
for {
select {
case <-ctx.Done():
fmt.Println("ctx end")
return
default :
fmt.Println("normal exec")
fmt.Println("wait systemChan catch exception , and customer, after close ctx cannel")
time.Sleep(1 * time.Second)
}
}
、指针赋值
// 指针赋值
// eg 1
var num int = 20
var age = &num
// 输出的是内存值
fmt.Printf(age)
// eg 2
var num int = 20
var age = &num
// 输出的是内存映射的值: 20
fmt.Printf(*age)
// eg 3
var num int = 20
var age = &num
*age = 30
// 输出均为30
// 原因:age 指向的是 num内存值,修改age内存值,同时num也会变
fmt.Printf(age)
fmt.Printf(num)
、允许跨域
// w 赋值变量
w *http.ResponseWrite
w.set("Access-Control-Allow-Origin", "*");
w.set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, PATCH");
w.set("Access-Control-Allow-Headers", "Origin, Content-Type, X-Auth-Token, Authorization");
、接口请求
、get
import (
"net/http"
"time"
"errors"
"json"
)
func Get() (resMap map[string]any, err error) {
url := ""
// 设置超时时间
client := http.Client{Timeout: 5*time.Second}
// url 请求
// resp, err := client.Get(url)
// 设置请求头
// 需要创建新的请求
request, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
]
request.Header.Add("key", "value")
// 发送请求并接受响应
resp, err := client.Do(request)
defer resp.Body.Close()
// 状态码验证
if resp.StatusCode != http.StatusOK {
return nil, erros.New("request is failed")
]
// read body
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
]
// json Unmarshal
resMap := make(map{string]any)
err := json.Unmarshal(body, &resMap)
return resMap, nil
}
、post
import (
"net/http"
"time"
"errors"
"json"
)
func Post(url string, postData url.Values, headerMap map[string]string) (resMap map[string]any, err error) {
client := &http.Client(Timeout: 5 * time.Second)
// 普通请求
// resp, err := client.PostForm(url, postData)
// 设置请求头情况下
// 创建新请求
// body 是 []byte 类型,需要使用 strings.NewReader() 对普通类型进行转换
// 当 Content-Type: application/json
// body := strings.NewReader(string(json.Marshal(postData)))
// 当 Content-Type: application/x-www-form-urlencoded
// body := strings.NewReader(string(postData。Encode()))
request, err := http.NewRequest("POST", "url", body)
if err != nil {
return nil, err
]
// 设置请求头
request.Header.Add("Content-Type", "application/json")
// 发送请求并接受响应
resp, err := client.Do(request)
if err != nil {
return nil, err
]
// 关闭请求体
defer resp.Body.Close()
if err != nil {
return nil, err
]
// read body
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
]
// json Unmarshal
resMap := make(map{string]any)
err := json.Unmarshal(body, &resMap)
return resMap, nil
}
、算法加密(加解编码)
、urlencode(base64(sha256)) 进行加密
// pgk 引入
import "crypto/hmac"
import "crypto/sha256"
import "encoding/base64"
import "net/url"
// HmacSHA256
// 加密key
key := 123456
// 加密内容
content := "差一步美满"
// 创建hmac
h := hmac.New(sha256.New, []bute(key))
// 内容加密
hashed := h.Write([]byte(content))
// 获取加密后的二进制内容
bodyErjinzhi := hashed.Sum(nil)
// base64 转码
base64Strings := base64.StdEncoding.EncodeToString(bodyErjinzhi)
// urlencode 编码
urlencodeStrings := url.QueryEscape(base64Strings)
、?反向代理
、文件类型从multipart.FileHeader 转为 os.file
// 创建临时文件
// param
// dir -- 临时文件存储的路径、如果为空则使用os.TempDir() 返回的路径
// prefix - 临时文件前缀
// return
// os.file
// err error
f, err := ioutil.TempFile("dir", "prefix")
if err != nil {
fmt.PrintIn("tmp file is failed")
fmt.Println(err)
}
// 文件copy
// param
// dit-- 填充文件
// src- 目标文件(复制的文件)【必须是文件内容(.open()后的)】
// return
// wriner int64
// err error
f. err := is.Copy("dit", "src")
if err != nil {
fmt.PrintIn("file copy is failed")
fmt.Println(err)
}
// 读取复制的文件
osFile, err := os.Open(f.Name())
if err != nil {
fmt.PrintIn("openfile is failed")
fmt.Println(err)
}
总结
Golang系列
Golang 之 环境安装
Golang 之 初识
Golang 之 扩展包介绍与应用