我有一个简单的 Go 界面:
type ReadTimeSeriesRepository interface {
GetTimeSeries(database string, params any) (*models.TimeSeriesResponse, domain.Error)
}
如您所见,params 的类型为any (interface{})
所以,我有以下实现:
type influxV2Client struct {
client influxdb2.Client
}
func (c *influxV2Client) GetTimeSeries(database string, params models.BaseTimeSeriesQuery) (*models.TimeSeriesResponse, domain.Error) {
queryAPI := c.client.QueryAPI(config.Cfg.InfluxOrg)
// Patch
query := `from(bucket: "417")
|> range(start: 1706745600, stop: 1706828400)
|> filter(fn: (r) => r._measurement == "energy")
|> filter(fn: (r) => r._field == "clean")`
// End Patch
result, err := queryAPI.Query(context.Background(), query)
if err != nil {
log.Println("Error: ", err.Error()) // Pending proper management
}
// Use Next() to iterate over query result lines
for result.Next() {
// Observe when there is new grouping key producing new table
if result.TableChanged() {
fmt.Printf("table: %s\n", result.TableMetadata().String())
}
// read result
fmt.Printf("row: %s\n", result.Record().String())
}
if result.Err() != nil {
fmt.Printf("Query error: %s\n", result.Err().Error())
}
return nil, nil
}
如您所见,在本例中,params 的类型为 models.BaseTimeSeriesQuery,即:
type BaseTimeSeriesQuery struct {
Measurement []string `json:"measurement"`
Start string `json:"start"`
Stop *string `json:"stop"`
Tags map[string]string `json:"tags"`
TagOperator string `json:"tag_operator"`
Fields []string `json:"fields"`
}
据我了解,这种类型必须满足空接口(我理解任何类型都满足它)。但后来我得到这个错误:
cannot use timeSerieRepositoryInfluxV2 (variable of type *"github.com/diegolatorre16/go-time-series/app/repositories/time_series".influxV2Client) as ports.ReadTimeSeriesRepository value in argument to services.GetTimeSeries: *"github.com/diegolatorre16/go-time-series/app/repositories/time_series".influxV2Client does not implement ports.ReadTimeSeriesRepository (wrong type for method GetTimeSeries)
have GetTimeSeries(string, models.BaseTimeSeriesQuery) (*models.TimeSeriesResponse, "github.com/diegolatorre16/go-time-series/app/domain".Error)
want GetTimeSeries(string, any) (*models.TimeSeriesResponse, "github.com/diegolatorre16/go-time-series/app/domain".Error)
我对 Go 还很陌生,我想我对 Go 中的接口工作方式有些困惑
正如错误所说“influxV2Client没有实现ports.ReadTimeSeriesRepository”,要实现ReadTimeSeriesRepository,influxV2Client应该这样定义:
func (c *influxV2Client) GetTimeSeries(database string, params any) (*models.TimeSeriesResponse, domain.Error) { ... }
这样就可以同样的方式使用GetTimeSeries()了。