使用指针作为函数的参数

时间:2017-07-17 13:41:24

标签: go

我如何使用函数参数的方法?

func writeToInflux(c interface{}, host string, service string, state string) bool {
    fmt.Println(reflect.TypeOf(c), host, service)

    bp, e := client.NewBatchPoints(client.BatchPointsConfig{
        Database:  database,
        Precision: "us",
    })

    if e != nil {
        log.Print(e)
    }

    tags := map[string]string{
        "host":    host,
        "service": service,
    }

    fields := map[string]interface{}{
        "state": state,
    }

    pt, err := client.NewPoint("mon", tags, fields, time.Now())

    if err != nil {
        log.Print(err)
    }

    bp.AddPoint(pt)

    if err := c.Write(bp); err != nil {
        log.Print("write failed " + err)
    }

    return true
}

func handler(w http.ResponseWriter, r *http.Request) {
    c, err := client.NewHTTPClient(client.HTTPConfig{
        Addr:     "http://10.x.x.x:8086",
        Username: username,
        Password: password,
    })
    if err != nil {
        log.Print(err)
    }
    a := strings.Split(r.URL.Path, "/")
    writeToInflux(c, a[3], a[4], a[5])
}

在这个例子中,我不能使用c变量的参数,或者可能还有其他选项使用c作为参数来运作?

2 个答案:

答案 0 :(得分:1)

writeToInflux中,c interface{}未指定应实施的任何方法c。您应该使用正弦InfluxWriter界面,以便拨打c.Write

type InfluxWriter {
    Write(bp client.BatchPoints) (*client.Response, error)
}

或者,writeToInflux可以接受client.Client,让您可以访问其所有方法。

答案 1 :(得分:-1)

" C"是一个接口{}类型,在函数参数中有一个接口,你可以将任何结构或任何数据类型传递给它。

In your case you want c to use the function write
if err := c.Write(bp); err != nil {
        log.Print("write failed " + err)
    }

编译器不知道c的类型,因此您需要键入断言。

试试这个,它会起作用

newC,ok:=  c.(type of c)    type of C -> a struct or any type which has a method write

if ok {
    if err := newC.Write(bp); err != nil {
            log.Print("write failed " + err)
        }

}     

或者像这样改变你的功能

func writeToInflux(c client.Client, host string, service string, state string) bool