开发经验:go切片的继承

package main  
  
import (  
    "errors"  
    "fmt"  
)  
  
// LimitedSlice 是一个封装了切片的结构体,用于限制切片的最大容量  
type LimitedSlice struct {  
    slice  []int  
    maxCap int  
}  
  
// NewLimitedSlice 创建一个新的LimitedSlice实例,初始容量为0,最大容量为maxCap  
func NewLimitedSlice(maxCap int) *LimitedSlice {  
    return &LimitedSlice{  
        slice:  make([]int, 0, 0), // 初始时容量为0,长度也为0  
        maxCap: maxCap,  
    }  
}  
  
// Append 尝试向切片中添加一个元素,如果添加后容量不超过最大容量,则返回nil;否则返回错误  
func (ls *LimitedSlice) Append(value int) error {  
    if len(ls.slice)+1 > ls.maxCap {  
        return errors.New("cannot append: slice capacity exceeds maximum")  
    }  
  
    // 如果当前容量不足以容纳新元素,则先扩容(但不超过最大容量)  
    if cap(ls.slice) < ls.maxCap {  
        ls.slice = append(ls.slice, 0) // 临时扩容,注意这里只是预留空间,并不添加实际元素  
        ls.slice = ls.slice[:len(ls.slice)-1] // 还原长度  
    }  
  
    // 现在可以安全地添加新元素了  
    ls.slice = append(ls.slice, value)  
    return nil  
}  
  
// GetSlice 返回内部切片的视图(只读)  
func (ls *LimitedSlice) GetSlice() []int {  
    return ls.slice  
}  
  
func main() {  
    ls := NewLimitedSlice(10)  
    for i := 0; i < 10; i++ {  
        if err := ls.Append(i); err != nil {  
            fmt.Println(err)  
            break  
        }  
    }  
  
    // 尝试添加第11个元素,应该会失败  
    if err := ls.Append(10); err != nil {  
        fmt.Println(err)  
    }  
  
    fmt.Println(ls.GetSlice()) // 输出: [0 1 2 3 4 5 6 7 8 9]  
}

上面的Append方法中的扩容逻辑实际上并不是必需的,因为当你尝试向切片添加元素时,如果切片当前的容量不足以容纳新元素,append函数会自动进行扩容(直到达到某个上限,这个上限由Go运行时决定,而不是由你指定的最大容量决定)。然而,由于我们在这里想要模拟一个最大容量的限制,所以我们没有让append自动扩容到超过我们指定的最大容量。但是,上面的代码示例中,Append方法中的扩容逻辑(即ls.slice = append(ls.slice, 0)和ls.slice = ls.slice[:len(ls.slice)-1])实际上并没有真正起到限制容量的作用,因为它只是临时地增加了一个空间然后又移除了它。在这个特定的例子中,你可以省略这部分逻辑,因为当append试图超过我们设定的最大容量时,len(ls.slice)+1 > ls.maxCap条件已经足够阻止进一步的添加操作了。

如果你想要一个更严格的容量限制,你可能需要完全避免使用append的自动扩容特性,并在每次添加元素时都手动检查容量。但是,这通常不是使用切片时推荐的做法,因为这会失去切片提供的大部分灵活性和便利性。相反,你可能需要重新考虑你的数据结构选择,或者接受Go切片在容量方面的灵活性。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值