go解析Prometheus的数据

简介: 访问一个api, 返回如下数据: {"status":"success","data":{"resultType":"matrix","result":[{"metric":{},"values":[[1473820558.

访问一个api, 返回如下数据:

{"status":"success","data":{"resultType":"matrix","result":[{"metric":{},"values":[[1473820558.361,"28765"],[1473820573.361,"28768"],[1473820588.361,"28772"],[1473820603.361,"28776"],[1473820618.361,"28780"],[1473820633.361,"28783"],[1473820648.361,"28786"],[1473820663.361,"28790"],[1473820678.361,"28793"],[1473820693.361,"28796"],[1473820708.361,"28799"],[1473820723.361,"28802"],[1473820738.361,"28806"],[1473820753.361,"28809"],[1473820768.361,"28817"],[1473820783.361,"28829"],[1473820798.361,"28832"],[1473820813.361,"28858"],[1473820828.361,"28862"],[1473820843.361,"28867"],[1473820858.361,"28873"]]}]}}


js, err := simplejson.NewJson(body)
    if err != nil {
        panic(err.Error())
    }
    //解析数组
    arr, _ := js.Get("data").Get("result").GetIndex(0).Get("values").Array()
    length := len(arr)
 
    for i := 0; i < length; i++ {
        x:= *js.Get("data").Get("result").GetIndex(0).Get("values").GetIndex(i).GetIndex(0))
        //fmt.Println(*js.Get("data").Get("result").GetIndex(0).Get("values").GetIndex(i).GetIndex(1))
    }

访问一个api, 返回如下数据:

{
  "data": {
    "trend": {
      "fields": [
        "min_time",
        "last_px",
        "avg_px",
        "business_amount"
      ],
      "600570.SS": [
        [
          201501090930,
          54.98,
          54.98,
          28327
        ],
        [
          201501090931,
          54.63,
          54.829486,
          49700
        ]
      ]
    }
  }
}

需要解析 600570.SS 后的json数据,用了 simplejson包

js, err := simplejson.NewJson([]byte(str))
check(err)
arr, _ := js.Get("data").Get("trend").Get("600570.ss").Array()

可是对返回的arr数据,用了18般武艺都解析不了。 arr类型理论是一个interface{}类型,但是里面又包含了四组数据,对于这类json数据,网上文档都没有解析的方法。 反复尝试后,用reflect.type 测试了下,发现系统把arr 认定为[]interface 类型,于是类型断言后,遍历。 这回可以把里面数据分拆开了,系统又把里面的数据判断为 json.Number数据类型。 然后就没有然后了.... 经过这一番摸索,对于空接口、类型断言,json包内部的一些设定有了更深的理解:空接口就是因为它灵活,所以在使用时要经过一系列的判断。

上代码:

package main

import (
    "encoding/json"
    "fmt"
    "github.com/bitly/go-simplejson"
    "io/ioutil"
    "net/http"
    //"reflect"
    "regexp"
    "strconv"
    "strings"
)

//const blkSize int = 10000

type trend struct {
    date    int64
    last_px float32 //最新价
    avg_px  float32 //平均价
    volumn  float32 //成交量
}

var (
    lines   []string
    blksLen []int
    isGB    bool
)

func check(err error) {
    if err != nil {
        panic(err.Error())
    }
}

func Get(url string) ([]byte, error) {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    resp, err := http.Get(url)
    check(err)
    //Println(resp.StatusCode)
    if resp.StatusCode != 200 {
        panic("FUCK")
    }
    return ioutil.ReadAll(resp.Body)
}

func strip(src string) string {
    src = strings.ToLower(src)
    re, _ := regexp.Compile(`<!doctype.*?>`)
    src = re.ReplaceAllString(src, "")

    re, _ = regexp.Compile(`<!--.*?-->`)
    src = re.ReplaceAllString(src, "")

    re, _ = regexp.Compile(`<script[\S\s]+?</script>`)
    src = re.ReplaceAllString(src, "")

    re, _ = regexp.Compile(`<style[\S\s]+?</style>`)
    src = re.ReplaceAllString(src, "")

    re, _ = regexp.Compile(`<.*?>`)
    src = re.ReplaceAllString(src, "")

    re, _ = regexp.Compile(`&.{1,5};|&#.{1,5};`)
    src = re.ReplaceAllString(src, "")

    src = strings.Replace(src, "\r\n", "\n", -1)
    src = strings.Replace(src, "\r", "\n", -1)
    return src
}

func Do(url string) string {
    body, err := Get(url)
    check(err)
    plainText := strip(string(body))
    return plainText
}

func main() {

    str := Do("http://xxx:8081/quote/v1/trend?prod_code=600570.SS&fields=last_px,business_amount,avg_px")
    js, err := simplejson.NewJson([]byte(str))
    check(err)
    arr, _ := js.Get("data").Get("trend").Get("600570.ss").Array()
    t := len(arr)
    stockdata := trend{}
    trends := make([]trend, 0, t)
    for _, v := range arr {
        //就在这里i进行类型判断
        value, _ := v.([]interface{})
        for k, u := range value {

            x, _ := u.(json.Number) //类型断言
            y, _ := strconv.ParseFloat(string(x), 64) //将字符型号转化为float64
            //v := reflect.ValueOf(k)
            //fmt.Println("type:", v.Type())
            switch k {
            case 0:
                stockdata.date = int64(y)
            case 1:
                stockdata.last_px = float32(y)
            case 2:
                stockdata.volumn = float32(y)
            case 3:
                stockdata.avg_px = float32(y)
            default:
                fmt.Println("结构体中不存在此元素")

            }

        }
        trends = append(trends, stockdata)

    }
    fmt.Println(trends)
}
目录
相关文章
|
5月前
|
人工智能 安全 Shell
Go并发编程避坑指南:从数据竞争到同步原语的解决方案
在高并发场景下,如钱包转账,数据一致性至关重要。本文通过实例演示了 Go 中如何利用 `sync.Mutex` 和 `sync.RWMutex` 解决数据竞争问题,帮助开发者掌握并发编程中的关键技能。
Go并发编程避坑指南:从数据竞争到同步原语的解决方案
|
6月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
631 0
|
4月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
525 43
Go语言深度解析:从入门到精通的完整指南
|
5月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
168 3
|
5月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
8月前
|
Go
Go语言同步原语与数据竞争:Mutex 与 RWMutex
在Go语言并发编程中,数据竞争是多个goroutine同时读写共享变量且未加控制导致的问题,可能引发程序崩溃或非确定性错误。为解决此问题,Go提供了`sync.Mutex`和`sync.RWMutex`两种同步机制。`Mutex`用于保护临界区,确保同一时间只有一个goroutine访问;`RWMutex`支持多读单写的细粒度控制,适合读多写少场景。使用时需避免死锁,并借助`-race`工具检测潜在的数据竞争,从而提升程序稳定性和性能。
260 51
|
8月前
|
存储 设计模式 安全
Go 语言单例模式全解析:从青铜到王者段位的实现方案
单例模式确保一个类只有一个实例,并提供全局访问点,适用于日志、配置管理、数据库连接池等场景。在 Go 中,常用实现方式包括懒汉模式、饿汉模式、双重检查锁定,最佳实践是使用 `sync.Once`,它并发安全、简洁高效。本文详解各种实现方式的优缺点,并提供代码示例与最佳应用建议。
278 5
|
6月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
486 0
|
6月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
8月前
|
编译器 测试技术 Go
Go语言同步原语与数据竞争:数据竞争的检测工具
本文介绍了 Go 语言中数据竞争(Data Race)的概念及其检测方法。数据竞争发生在多个 Goroutine 无同步访问共享变量且至少一个为写操作时,可能导致程序行为不稳定或偶发崩溃。Go 提供了内置的竞态检测器(Race Detector),通过 `-race` 参数可轻松检测潜在问题。文章还展示了如何使用锁或原子操作修复数据竞争,并总结了在开发和 CI 流程中启用 `-race` 的最佳实践,以提升程序稳定性和可靠性。

推荐镜像

更多
  • DNS