douqingzhi0980 2016-07-10 09:06
浏览 65
已采纳

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

In my use case I am using influxdb. I am trying to create a global client to influxdb in Golang. But when I return the influxdb client from a function, the client object is not exported in the influxdb package. So I am not able to return this.

Here is my code:

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() function is trying to return the client object *client.client.
But the client object is not exported in influxdb golang package.
So how can I handle this problem?
Could anyone help me with this?

Thanks

  • 写回答

1条回答 默认 最新

  • dongqiao8417 2016-07-10 09:58
    关注

    the package client // import "github.com/influxdata/influxdb/client/v2"
    has exported Client interface so use client.Client instead of *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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 flask项目,怎么使用AJAX传数据库数据到echarts图表的data里,实现异步加载数据。
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题