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)
}
相关推荐
韩数1 分钟前
小白也能看懂! 今年爆火的 MCP 协议究竟是什么?写给普通人的 MCP 指南
后端·aigc·mcp
dangdang___go5 分钟前
动态内存管理||malloc和free.realloc和calloc
c语言·开发语言·算法·动态内存管理
l***46685 分钟前
SSM与Springboot是什么关系? -----区别与联系
java·spring boot·后端
YA33315 分钟前
mcp-grafana mcp 使用stdio报错
java·开发语言
周杰伦_Jay18 分钟前
【Go 语言主流 Web】 框架详细解析
开发语言·后端·微服务·架构·golang
风的归宿5523 分钟前
openresty容器导出火焰图
后端
i听风逝夜24 分钟前
Web 3D地球实时统计访问来源
前端·后端
Python私教24 分钟前
省下5万培训费!这份Python量化自学路线,比付费课更狠
后端
w***954926 分钟前
VScode 开发 Springboot 程序
java·spring boot·后端
豆浆Whisky41 分钟前
Go微服务通信优化:从协议选择到性能调优全攻略|Go语言进阶(20)
后端·微服务·go