自学内容网 自学内容网

开发经验: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切片在容量方面的灵活性。


原文地址:https://blog.csdn.net/weixin_45032905/article/details/140155438

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!