Go小工具合集

一、处理json字符串数据

go 复制代码
package main

import (
   "fmt"
   "github.com/tidwall/gjson"
)

const json = `{
  "username": "tanglei",
  "pwd": "111111",
  "info": {
    "age": "18",
    "sex": "男",
    "love": [
      {
        "python": "selenium1",
        "java": "jmeter"
      },
      {
        "vue": "element",
        "react": {
          "test1": "123",
          "test2": {
            "name": "${name}"
          }
        }
      }
    ]
  }
}
`

func main() {
   value := gjson.Get(json, "info.love.1.react.test2.name")
   fmt.Println(value.String())
}

二、读取json文件

go 复制代码
package main

import (
   "fmt"
   "io/ioutil"
   "os"
)

func readJSONFile(path string) string {
   // 打开json文件  path:json文件路径
   jsonFile, err := os.Open(path)
   // 最好要处理以下错误
   if err != nil {
      fmt.Println(err)
   }
   // 要记得关闭
   defer jsonFile.Close()
   byteValue, _ := ioutil.ReadAll(jsonFile)
   return string(byteValue)
}


func main() {
   jsonData := readJSONFile("user.json")
   fmt.Println(jsonData)
}

三、将json格式数据处理成map

go 复制代码
func jsonToMap(data string) (result map[string]interface{}){
   err := json.Unmarshal([]byte(data), &result)
   if err != nil {
      fmt.Println("JsonToMapDemo err: ", err)
   }
   return
}

四、随机从数组里取值

go 复制代码
package main

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

func randomAccessData(data []string) string {
   /*
      rand.Seed:还函数是用来创建随机数的种子,如果不执行该步骤创建的随机数是一样的,因为默认Go会使用一个固定常量值来作为随机种子。
      time.Now().UnixNano():当前操作系统时间的毫秒值
   */
   rand.Seed(time.Now().UnixNano())
   /*生成一个随机数*/
   a := rand.Intn(len(data))
   return data[a]
}

func main() {
   res2 := []string{"1", "2", "3", "4", "5", "6"}
   res3 := randomAccessData(res2)
   fmt.Println(res3)
}

五、正则匹配

go 复制代码
package main

import (
   "fmt"
   "regexp"
)

func matchRegular(data string, rule string) (res []string) {
   // data: 需要匹配的字符串    rule: 匹配的规则  res: 返回数组
   //1)解释规则,他会解析正则表达式,如果成功返回解释器
   reg1 := regexp.MustCompile(rule)
   if reg1 == nil { //解释失败,返回nil
      fmt.Println("err = ")
      return
   }
   //2)根据规则提取关键信息,-1表示匹配所有项,正数为匹配项数
   result := reg1.FindAllStringSubmatch(data, -1)
   for _, value := range result {
      res = append(res, value[1])
   }
   return res
}


func main() {
   jsonData := `{"username": "root","pwd": "123456","info": {"age": "18","sex": "男","love": [{"python": "selenium1","java": "jmeter"}]}}`
   res0 := matchRegular(jsonData, `"pwd": "(.+?)"`)
   fmt.Println(res0)
}

六、生成随机IP地址

go 复制代码
package main

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

func randIP() string {
   /*
      rand.Seed:还函数是用来创建随机数的种子,如果不执行该步骤创建的随机数是一样的,因为默认Go会使用一个固定常量值来作为随机种子。
      time.Now().UnixNano():当前操作系统时间的毫秒值
   */
   rand.Seed(time.Now().UnixNano())
   /*生成一个随机数*/
   a := rand.Intn(256)
   b := rand.Intn(256)
   c := rand.Intn(256)
   d := rand.Intn(256) //实际随机生成的数字范围[0,255]
   ip := fmt.Sprintf("%d.%d.%d.%d", a, b, c, d)
   return ip
}

func main() {
   ip := randIP()
   fmt.Println(ip)
}

七、go http客户端(使用三方库构造)

go 复制代码
package main

import (
   "fmt"
   "github.com/kirinlabs/HttpRequest"
   "strings"
)

func handleRes(resp *HttpRequest.Response,err error) (result string,error error) {
   defer resp.Close()
   if err != nil {
      error = err
      return "", err
   }
   body, _ := resp.Body()
   result = string(body)
   return
}

// 处理请求方式为get,并且参数是body的情况
func requestsGetBody(url string, headers map[string]string, data map[string]interface{}) (result string, error error) {
   //JSON序列化
   configData, _ := json.Marshal(&data)
   param := bytes.NewReader(configData)
   fmt.Println("data:", data)
   //构建http请求
   client := &http.Client{}
   req, err1 := http.NewRequest("GET", url, param)
   if err1 != nil {
      error = err1
      return "", err1
   }
   //header
   for key, value := range headers {
      req.Header.Add(key, value)
   }
   //发送请求
   res, err2 := client.Do(req)
   if err2 != nil {
      error = err2
      return "", err2
   }
   defer res.Body.Close()
   //返回结果
   body, err3 := ioutil.ReadAll(res.Body)
   if err3 != nil {
      error = err3
      return "", err3
   }
   result = string(body)
   return
}

// 发送请求
func sendRequests(method string, url string, headers map[string]string, cookies map[string]string, data map[string]interface{}) (result string, error error) {
   req := HttpRequest.NewRequest().Debug(false).SetTimeout(5)
   req.SetHeaders(headers)
   req.SetCookies(cookies)
   if strings.Contains(strings.ToUpper(method), "GET") {
      headerValue, _ := json.Marshal(headers)
      headerString := string(headerValue)
      if strings.Contains(headerString, "json") {
         result, error = requestsGetBody(url, headers, data)
      } else {
         resp, err := req.Get(url, data)
         result, error = handleRes(resp, err)
      }
   } else if strings.Contains(strings.ToUpper(method), "POST") {
      resp, err := req.Post(url, data)
      result, error = handleRes(resp, err)
   }
   return
}


func main() {
   head := map[string]string{"Authorization": "JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiN2MzZGY4NjUtMGJjYS00MDRjLThmMzAtODVlNjNiOThlNmNlIiwidXNlcm5hbWUiOiJhZG1pbiIsImV4cCI6MTYzNzU5MzQ5NywiZW1haWwiOiJhZG1pbkBxcS5jb20ifQ.1BOeh4HABB2J-Vfr_uG9tAeobURIjFVXlGpQjtLqeZI"}
   cookie := map[string]string{}
   data := map[string]interface{}{}
   resp , err := sendRequests("get", "http://127.0.0.1:10000/interface", head, cookie, data)
   fmt.Println("resp:",resp)
   fmt.Println("err:",err)
}
相关推荐
Cosolar1 分钟前
LlamaIndex RAG 本地部署+API服务,快速搭建一个知识库检索助手
后端·openai·ai编程
好大哥呀23 分钟前
C++ Web 编程
开发语言·前端·c++
MX_935923 分钟前
SpringMVC请求参数
java·后端·spring·servlet·apache
ID_1800790547330 分钟前
小红书笔记评论 API,Python 调用示例与完整 JSON 返回参考
java·开发语言
忆想不到的晖1 小时前
Codex 探索:别急着调 Prompt,先把工作流收住
后端·agent·ai编程
weixin_408099671 小时前
【实战对比】在线 OCR 识别 vs OCR API 接口:从个人工具到系统集成该怎么选?
图像处理·人工智能·后端·ocr·api·图片文字识别·文字识别ocr
南境十里·墨染春水2 小时前
C++ 笔记 友元(面向对象)
开发语言·c++·笔记
TT_44192 小时前
python程序实现图片截图溯源功能
开发语言·python
笨笨饿2 小时前
20_Git 仓库使用手册 - 初学者指南
c语言·开发语言·嵌入式硬件·mcu·学习
人间打气筒(Ada)2 小时前
go实战案例:如何通过 Service Meh 实现熔断和限流
java·开发语言·golang·web·istio·service mesh·熔断限流