将[]byte(uint8)转换为float64的方法在golang中

太长不看

我已根据您的评论进行了更新!暂时这样试试看,但可能还有更好的方法,希望有经验的人能告诉我。

f := *(*float64)(unsafe.Pointer(&out[0]))

动机和背景

鉴于希望在使用Prometheus进行服务器资源监控时,我发现现有的exporter无法提供所需的指标,因此决定尝试自己编写一个exporter。这是我第一次接触golang编程,上个周末刚刚尝试了一下hello world。

在创建出口商之前,我在几种语言中发现了一些格式和库,但我决定尝试使用Go语言以完成。我先完成了官方的入门教程,然后参考了一些文章来制作出口商。成品位于此。

使用bash命令来获取Metrics数据。

我打算在另一个机会学习如何在golang中获取低级别信息,所以我使用bash命令获取Linux服务器的指标。
参考文章:
整理如何在Golang中执行外部命令的方法
在Go中使用管道执行外部命令
处理UNIX命令管道的Golang实例(Big Sky)

最终,我使用mattn先生发布的go-pipeline来编写了UNIX命令的管道处理。

go-pipeline 的返回结果是 []byte。

尽管能够执行bash命令,但我发现其返回值是以 []byte(uint8) 的形式返回的。
根据输出格式要求,exporter需要使用float64传递数字,所以需要进行 []byte 到 float64 的转换。

[]byte 转换为 float64 的方法

暫且粗略地搜尋了一下,在StackOverFlow上有一篇名為「將byte數組“[]uint8”轉換為float64在GoLang中(StackOverFlow)」的文章,似乎不能直接使用庫或函數來完成,看起來要對二進制數組進行某種處理,唔,我不太想這麼做。

在图书馆中,我发现可以使用strconv这个函数。
经过一番尝试后,我得出了以下结论:首先将[]byte转化为string,同时剪掉末尾的\n字符,然后再用strconv将得到的string转换为float64类型。通过这种方法,我们成功解决了问题。但是,真的需要为了这么简单的需求做这么多步骤吗?这让我有些怀疑。

package main

import (
    //  "fmt"
    "flag"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
    "log"
    "net/http"

    "github.com/mattn/go-pipeline" // go-pipeline : https://github.com/mattn/go-pipeline
    "strconv"
    "strings"
    "unsafe"
)

~~ 中略 ~~

func get443Estab() float64 {
    out, err := pipeline.Output(
        []string{"netstat", "-n"},
        []string{"grep", "ESTABLISHED"},
        []string{"grep", ":443"},
        []string{"wc", "-l"},
    )
    if err != nil {
        // PIPESTATUSの中に一つでも0以外が含まれると err : exit status ${status} になるので注意
        return float64(0)
    }
    f, err := strconv.ParseFloat(strings.TrimRight(*(*string)(unsafe.Pointer(&out)), "\n"), 64)
    if err != nil {
        return float64(0)
    }
    return float64(f)
}

~~  ~~

如果有更好的方法,请告诉我 m(_ _)m

版本等

 # go version
go version go1.10.4 linux/amd64
广告
将在 10 秒后关闭
bannerAds