我如何使用函数参数的方法?
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作为参数来运作?
答案 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