繁体   English   中英

如何使用第三方软件包中未导出的对象作为golang中的返回类型?

[英]How to use an un exported object from third party package as return type in golang?

在我的用例中,我正在使用influxdb。 我正在尝试为Golang中的influxdb创建一个全局客户端。 但是,当我从函数返回influxdb客户端时,客户端对象未在influxdb包中导出。 因此,我无法退货。

这是我的代码:

package influxclient

import (
    "github.com/influxdata/influxdb/client/v2"
    "log"
    "time"
    //"net/http"
    "fmt"
    "reflect"
)

const (
    INFLUXDB_NAME = "XXXX"
    USERNAME      = "YYYY"
    PASSWORD      = "ZZZZ"
    HOST          = "http://localhost:8086"
)

var (
    c             = getHTTPClient()
)

func test() {
    // Create a new point batch
    bp, _ := client.NewBatchPoints(client.BatchPointsConfig{
        Database:  INFLUXDB_NAME,
        Precision: "s",
    })

    // Create a point and add to batch
    tags := map[string]string{"cpu": "cpu-total"}
    fields := map[string]interface{}{
        "idle":   10.1,
        "system": 53.3,
        "user":   46.6,
    }
    fmt.Println(reflect.TypeOf(c))
    pt, _ := client.NewPoint("cpu_usage", tags, fields, time.Now())
    bp.AddPoint(pt)

    // Write the batch
    c.Write(bp)
}

//publish metrics to metrics db
func PublishMetrics(metricName string, tags map[string]string, fields map[string]interface{}, time time.Time) error {
    fmt.Println("type of client c ", reflect.TypeOf(c))
    // Create a new point batch
    bp, err := client.NewBatchPoints(client.BatchPointsConfig{
        Database:  INFLUXDB_NAME,
        Precision: "s",
    })
    if err != nil {
        return err
    }
    pt, err := client.NewPoint(metricName, tags, fields, time)
    if err != nil {
        return err
    }
    bp.AddPoint(pt)
    // Write the batch
    c.Write(bp)
    return nil
}


func getHTTPClient() *client.client {
    //make http client for metrics db
    c, err := client.NewHTTPClient(client.HTTPConfig{
        Addr:     HOST,
        Username: USERNAME,
        Password: PASSWORD,
    })
    if err != nil {
        log.Printf("FATAL :: Error occured in getting influxdb metric client %s ", err.Error())
    }
    return c
}

getHTTPClient()函数正在尝试返回客户端对象*client.client
但是客户端对象不会以influxdb golang包导出。
那我该如何解决这个问题呢?
有人可以帮我吗?

谢谢

package client // import "github.com/influxdata/influxdb/client/v2"
已经导出了Client interface因此请使用client.Client而不是*client.client

package influxclient

import (
    "log"
    "time"

    "github.com/influxdata/influxdb/client/v2"
    //"net/http"
    "fmt"
    "reflect"
)

const (
    INFLUXDB_NAME = "XXXX"
    USERNAME      = "YYYY"
    PASSWORD      = "ZZZZ"
    HOST          = "http://localhost:8086"
)

var c = getHTTPClient()

func test() {
    // Create a new point batch
    bp, _ := client.NewBatchPoints(client.BatchPointsConfig{
        Database:  INFLUXDB_NAME,
        Precision: "s",
    })

    // Create a point and add to batch
    tags := map[string]string{"cpu": "cpu-total"}
    fields := map[string]interface{}{
        "idle":   10.1,
        "system": 53.3,
        "user":   46.6,
    }
    fmt.Println(reflect.TypeOf(c))
    pt, _ := client.NewPoint("cpu_usage", tags, fields, time.Now())
    bp.AddPoint(pt)

    // Write the batch
    c.Write(bp)
}

//publish metrics to metrics db
func PublishMetrics(metricName string, tags map[string]string, fields map[string]interface{}, time time.Time) error {
    fmt.Println("type of client c ", reflect.TypeOf(c))
    // Create a new point batch
    bp, err := client.NewBatchPoints(client.BatchPointsConfig{
        Database:  INFLUXDB_NAME,
        Precision: "s",
    })
    if err != nil {
        return err
    }
    pt, err := client.NewPoint(metricName, tags, fields, time)
    if err != nil {
        return err
    }
    bp.AddPoint(pt)
    // Write the batch
    c.Write(bp)
    return nil
}

func getHTTPClient() client.Client {
    //make http client for metrics db
    c, err := client.NewHTTPClient(client.HTTPConfig{
        Addr:     HOST,
        Username: USERNAME,
        Password: PASSWORD,
    })
    if err != nil {
        log.Printf("FATAL :: Error occured in getting influxdb metric client %s ", err.Error())
    }
    return c
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM