【问题标题】:omit type of array in a function argument with golang [duplicate]用golang省略函数参数中的数组类型[重复]
【发布时间】:2019-06-26 08:25:09
【问题描述】:

我正在编写一个 write 方法,将值数组写入 InfluxDB

我想要的是能够拥有类似的东西:

func (influxClient *InfluxClient) Write(myArray []interface{}) (error) {
    fmt.Print(myArray)
    // Insert into DB
    return nil

}

myArray 可以是一个包含任何对象的数组

我尝试使用myArray []interface{} 省略 myArray 的类型,但它不起作用,我得到:

Cannot use 'meters' (type []models.Meter) as type []interface{}

有可能实现吗?

我该怎么办?

【问题讨论】:

  • 如果你尝试将某个东西的一部分格式化为一个界面的一部分,你应该看看here

标签: go type-inference


【解决方案1】:

这是因为 []models.Meter[]interface{} 是 Go 编译器的两种不同类型。

使用interface{} 通常不是最佳实践。最好定义自己的类型并改用它。

话虽如此,对于您的情况,最快的解决方案应该是使 Write 函数成为可变参数。就像下面的例子。

https://play.golang.org/p/KzzFMAjQvRa

func Write(myArray ...interface{}) (error) {
    fmt.Printf("Slice: %v\n", myArray)
    // Insert into DB
    return nil

}

【讨论】:

  • 是的,事情是我会有一个“对象”数组,所以......它可能不是最合适的
  • 您是说在调用Write 方法之前已经构建了对象切片吗?在这种情况下,您只需要像这样调用它:Write(mySlice...).
  • 是的,我在对象切片中的输入。对象类型可能会有所不同。我会检查是否有效
【解决方案2】:

如果你先复制到 []interface 实例是可能的

func main() {

   // Copy from your explicit type array
   var interfaceSlice []interface{} = make([]interface{}, len(models.Meter))

   for i, Modelvalue := range models.Meter {
       interfaceSlice[i] = Modelvalue
   }    

   influxClient.Write(interfaceSlice)
}

Wiki Interface slice and arrays

Playground sample

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多