将限制切片限制为最大元素

时间:2018-02-08 12:34:34

标签: go

如何设置切片最大元素?

我只想要50个元素而不是50个......

这是我的代码

var result []*HistoryData
func convertHistoryResults(currenthashrate int64, online int64, offline int64, now int64) []*HistoryData {
    history := HistoryData{}
    history.CurrentHashrate = currenthashrate
    history.Online = online
    history.Offline = offline
    history.Timestamp = now
    result = append(result, &history)
    return result
}

它的工作,但它推动无限的元素...所以我有一个很长的片。我想设置50的最大值。所以我试过

result = append(result[:50], &history)

所以我每次都会覆盖第50个元素,但是idk不起作用:/

我希望在达到第50个元素时关闭第一个元素并设置51,当关闭1时...最新的最后一个和最早的切断

2 个答案:

答案 0 :(得分:2)

没有像这样的内置功能。你只需要检查一下:

var result []*HistoryData
func convertHistoryResults(currenthashrate int64, online int64, offline int64, now int64) ([]*HistoryData, error) {
    if len(result) >= 50 {
        return nil, errors.New("result too long")
    }
    history := HistoryData{}
    history.CurrentHashrate = currenthashrate
    history.Online = online
    history.Offline = offline
    history.Timestamp = now
    result = append(result, &history)
    return result, nil
}

答案 1 :(得分:0)

这对您有用,但它会为每个附加内容分配内存,因此请确保您不会遇到此代码的性能问题:

i := 0
slice := []int{}
limit := 5
for i < 30 {
    if len(slice) > limit {
        slice = append(slice[1:], i)
    } else {
        slice = append(slice, i)
    }
    fmt.Println(slice)
    i++
}