如何解决函数中的Go数组大小问题

时间:2017-06-11 11:39:55

标签: arrays go

我刚开始使用Go,让我感到紧张的一件事是,如果我定义一个接受数组的函数,然后将数组传递给具有特定大小的函数,VS Code会抱怨它。

例如,我有这样的事情:

func cmplt(a, b []uint64) uint64 {
    var r, m, i uint64
    r = 0
    m = 0

    for i = 2; i >= 0; i-- {
        r |= LtUint64(a[i], b[i]) & ^m
        m |= MaskUint64(NeUint64(a[i], b[i]))
    }

    return r & 1
}

然后我在另一个函数中调用此函数:

func singleSample(in []uint64) uint64 {
    var i, index uint64
    index = 0

    for i = 0; i < 52; i++ {
        index = SelectUint64(index, i+1, cmplt(in, table[i]))
    }

    return index
}

其中table的类型为[52][3]uint64。我收到一条错误消息:cannot use table (type [3]uint64) as []uint64 in argument to cmplt

Go中有没有办法解决这个问题,而不是在函数参数中专门指定数组大小?

2 个答案:

答案 0 :(得分:3)

您的cmplt期待uint64切片,而不是3个元素数组。 table[i] Taking a slice将解决错误:

cmplt(in, table[i][:])

答案 1 :(得分:0)

从我看到的最佳解决方案是将cmplt函数定义更改为接受数组:

func cmplt(a, b [3]uint64) uint64 {

在您的代码中,您可以依赖于底层数组的大小,因此请确保尽可能清楚地指定您的函数依赖性