Go 将指针用作函数';s论点

Go 将指针用作函数';s论点,go,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, Preci

如何使用函数参数的方法

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作为函数的参数?

writetoinflox
中,
c接口{}
没有指定
c
应该实现的任何方法。您应该使用sine
InfluxWriter
接口,以便调用
c.Write

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

或者,
writeToInflux
可以接受一个
客户端。客户端
,允许您访问它的所有方法。

writeToInflux
中,
c接口{}
没有指定任何
c
应该实现的方法。您应该使用sine
InfluxWriter
接口,以便调用
c.Write

type InfluxWriter {
    Write(bp client.BatchPoints) (*client.Response, error)
}
或者,
writeToInflox
可以接受一个
客户机。客户机
,允许您访问它的所有方法。

“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
“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

为什么
c
中的
writeToInflux
接口{}
?出于某种原因,是否需要向该函数传递多个类型?如果您将
c
设置为正确的类型,它将正常工作。为什么
c
writetoinflox
中是
接口{}
?出于某种原因,是否需要向该函数传递多个类型?如果将
c
设置为正确的类型,这就行了。也许有可能将c作为参数传递给它的所有方法?确实有:)你的
writeToInflox
可以接受
c客户机。客户机
在其参数中。但是传递接口名有一个好处:通过这样做,可以使用实现接口的任何类型,不仅仅是客户端。@FuzzyAmi问题是(我一开始没有注意到),OP使用的是
github.com/influxdata/influxdb/Client/v2
,而不是
github.com/influxdata/influxdb/Client
。这意味着
client.client
已经是一个接口:)可能有一些可能性将c作为参数传递给它的所有方法?确实有:)您的
writeToInflox
可以在其参数中接受
c client.client
。但是传递接口名称有一个好处:通过这样做,任何实现接口可以使用,而不仅仅是客户端。@FuzzyAmi问题是(一开始我没有注意到),OP使用的是
github.com/influxdata/influxdb/Client/v2
,而不是
github.com/influxdata/influxdb/Client
。这意味着
client.client
已经是一个接口:)我怀疑这是推荐的方法。最好修改函数参数以命名实现write()的实际接口。只有当您真正受益于接口{}提供的灵活性时,才使用类型断言。我相信@yazgazan所做的是更好的方法。由于目的是在
c
上调用
Write
方法,因此您可能希望为其定义一个接口,而不是使用空接口和类型断言。我怀疑这是推荐的方法。最好修改函数参数以命名实现write()的实际接口。只有当您真正受益于接口{}提供的灵活性时,才使用类型断言。我相信@yazgazan所做的是更好的方法。由于目的是在
c
上调用
Write
方法,因此您需要为其定义一个接口,而不是使用空接口和类型断言。