为什么 Go 中特定类型不满足空接口?

问题描述 投票:0回答:1

我有一个简单的 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 中的接口工作方式有些困惑

go interface
1个回答
0
投票

正如错误所说“influxV2Client没有实现ports.ReadTimeSeriesRepository”,要实现ReadTimeSeriesRepository,influxV2Client应该这样定义:

func (c *influxV2Client) GetTimeSeries(database string, params any) (*models.TimeSeriesResponse, domain.Error) { ... }

这样就可以同样的方式使用GetTimeSeries()了。

© www.soinside.com 2019 - 2024. All rights reserved.