为了账号安全,请及时绑定邮箱和手机立即绑定

对于Go中缺少数组/切片协方差的任何明智解决方案?

对于Go中缺少数组/切片协方差的任何明智解决方案?

Go
紫衣仙女 2021-04-09 13:15:31
我刚刚遇到的问题是在以下情况下该怎么办:func printItems(header string, items []interface{}, fmtString string) {  // ...}func main() {  var iarr = []int{1, 2, 3}  var farr = []float{1.0, 2.0, 3.0}  printItems("Integer array:", iarr, "")  printItems("Float array:", farr, "")}Go没有泛型,也不允许使用集合协方差:prog.go:26: cannot use iarr (type []int) as type []interface { } in function argument      prog.go:27: cannot use farr (type []float) as type []interface { } in function argument有想法吗?
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

没有任何一种,现在真的没有办法做到这一点

  1. 使您[]int[]float双方都进入[]interface{}

  2. 使printItems接受interface{}而不是[]interface{}使用反射,然后使用反射,类似于fmt包所做的事情。

两种解决方案都不是很漂亮。


查看完整回答
反对 回复 2021-04-26
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

使用反射的示例:


package main


import (

    "fmt"

    "reflect"

    "strings"

    "container/vector"

)


func printItems(header string, items interface{}, fmtString string) {

    value, ok := reflect.NewValue(items).(reflect.ArrayOrSliceValue)

    if !ok {

        panic("Not an array or slice")

    }


    stringBuilder := new(vector.StringVector)

    stringBuilder.Push(header)


    n := value.Len()

    for i := 0; i < n; i++ {

        stringBuilder.Push(fmt.Sprintf(fmtString, value.Elem(i).Interface()))

    }


    fmt.Println(strings.Join(*stringBuilder, ""))

}


func main() {

    var iarr = []int{1, 2, 3}

    var farr = []float{1.0, 2.0, 3.0}


    printItems("Integer array:", iarr, " %d,")

    printItems("Float array:", farr, " %.1f,")

}


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信