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
应该实现的任何方法。您应该使用sineInfluxWriter
接口,以便调用c.Write
:
type InfluxWriter {
Write(bp client.BatchPoints) (*client.Response, error)
}
或者,
writeToInflux
可以接受一个客户端。客户端
,允许您访问它的所有方法。在writeToInflux
中,c接口{}
没有指定任何c
应该实现的方法。您应该使用sineInfluxWriter
接口,以便调用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
方法,因此您需要为其定义一个接口,而不是使用空接口和类型断言。