GoLang之代码常见用法

前言

提示:本章节主要介绍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 之 扩展包介绍与应用

文档转载

  Multipart.FileHeader 转为 os.file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值