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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/769776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pydub、ffmpeg 音频文件声道选择转换、采样率更改

快速查看音频通道数和每个通道能力判断具体哪个通道说话&#xff1b;一般能量大的那个算是说话 import wave from pydub import AudioSegment import numpy as npdef read_wav_file(file_path):with wave.open(file_path, rb) as wav_file:params wav_file.getparams()num_cha…

通过卷防水上限,解锁手机的新玩法?IP68之间亦有不同

当手机的日常防水已经成了基本功&#xff0c;防水能力的上限便成了新的赛道。 毕竟再谨慎的人&#xff0c;也可能会有手滑的时候。这个时候&#xff0c;一台有着IP68级防水的手机&#xff0c;就能给你提供一份安心。 【IP68是标准上限&#xff0c;不是手机防水上限】 IP68是…

前端三件套开发模版——产品介绍页面

今天有空&#xff0c;使用前端三件套html、css、js制作了一个非常简单的产品制作页面&#xff0c;与大家分享&#xff0c;希望可以满足大家应急的需求。本页面可以对产品进行“抢购”、对产品进行介绍&#xff0c;同时可以安排一张产品的高清大图&#xff0c;我也加入了页面的背…

【数据结构】建堆的时间复杂度

一.向下调整建堆 1.二叉树层数与总节点个数关系 层数一定时&#xff0c;在二叉树节点个数最大的情况下&#xff0c;二叉树为满二叉树&#xff0c;如下图所示&#xff0c;可以清晰地看到在满二叉树中第h层有2^(h-1)个节点&#xff0c;总节点N就等于一个等比数列的求和&#xf…

Ollama + Docker + AnythingLLM 搭建本地多用户AI知识库

整个过程需要准备三个工具&#xff1a; Ollama&#xff1a; 用于运行本地大模型的管理&#xff1a;llama3, qwen2等 Docker&#xff1a;用于运行AnythingLLM。 AnythingLLM&#xff1a;知识库运行平台&#xff0c;提供知识库构建及运行的功能。 Ollama, Docker 这二个安装不…

帕金森病患者的运动秘诀:你值得更健康!

大家好&#xff0c;今天我想和大家聊聊一个我们可能不太熟悉&#xff0c;但却值得每一个人去关注的话题——帕金森病患者的运动。帕金森病&#xff0c;这个听起来有些陌生的名词&#xff0c;其实离我们并不遥远。随着年纪的增长&#xff0c;我们身边可能就有亲友正在遭受这个疾…

MIPI竖屏解决方案,普立晶POL8901升级POL8903 两PORT LVDS转MIPIDSI,加90度旋转

POL8903描述&#xff1a; 系统&#xff1a; •采用高性能MIPS 32位CPU内核&#xff1b; •高性能DSP内核图像处理单元&#xff1b; •16 KB指令Cache&#xff1b;16 KB数据Cache&#xff1b; •96 KB SRAM&#xff1b;内置DDR 3控制器&#xff1b; LVDS输入&#xff1a; …

【JD-GUI】MacOS 中使用Java反编译工具JD-GUI

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明概念理解一、基础环境说明1.1 硬件环境1.2 软件环境 二、下载与安装2.1 选择对应版本2.2 解压运行排除异常&#xff1a;2.3 关于…

ubuntu篇---添加环境变量并且在pycharm中使用

ubuntu篇—添加环境变量并且在pycharm中使用 一. 添加环境变量 vim ~/.bashrc 在文件末尾加上 保存退出 source ~/.bashrc二. 在pycharm中添加环境变量 1.打开pycharm&#xff0c;并打开你的项目 2.点击菜单栏中的“Run”&#xff0c; 选择“Edit Configurations” 3.在弹…

深入剖析 Android 网络开源库 Retrofit 的源码详解

文章目录 概述一、Retrofit 简介Android主流网络请求库 二、Retrofit 源码剖析1. Retrofit 网络请求过程2. Retrofit 实例构建2.1 Retrofit.java2.2 Retrofit.Builder()2.2.1 Platform.get()2.2.2 Android 平台 2.3 Retrofit.Builder().baseUrl()2.4 Retrofit.Builder.client()…

YOLOv8改进 添加CVPR2024 PKINet中注意力机制CAAttention

一、PKINet论文 论文地址:2403.06258 (arxiv.org) 二、CAAttention结构 CAA(Context Anchor Attention)注意力模块是一种用于捕捉长距离上下文信息的并行模块。 在计算机视觉领域中,上下文信息是指与目标物体或任务相关的周围环境和语境信息。上下文信息可以帮助我们更好…

如何用简单的html,css,js写出一个带有背景层的删除弹出框

虽然每次项目都是主要写后端&#xff0c;但是有时候前端的样式太丑了&#xff0c;也有点看不下去。弹出框是项目中用的比较多的&#xff0c;比如删除&#xff0c;修改或者添加什么的&#xff0c;都需要一个弹出框。 所以这里简单记录一下&#xff0c;应该如何实现。实现效果如…

rtpengine 项目

目录 &#xff01;1. 如果容器内部修改 rtpengine 并且让他生效 守护进程模块(daemon) 内核模块(kernel-module) 录音守护进程模块(recording-daemon) iptables扩展模块(iptables-extension) 2. 在Docker容器中编译好四个模块后&#xff0c;您需要采取以下步骤 1. 加载内…

安装维修制氮设备的注意指南

制氮设备在许多工业领域都发挥着重要作用&#xff0c;无论是确保生产过程中的氮气供应&#xff0c;还是维持设备的稳定运行&#xff0c;正确的安装和维修都是关键。以下是一些重要的注意事项&#xff0c;帮助您顺利完成制氮设备的安装与维修工作。 一、安装注意事项 (一)选址与…

香橙派AIpro如何赋能AI+边缘流媒体设备

文章目录 &#xff08;一&#xff09;前言&#xff08;二&#xff09;AI边缘流媒体设备展示&#xff08;三&#xff09;赋能AI边缘流媒体设备1、准备开发环境2、在板子中下载编译安装SRS3、基本推拉流测试4、多路推流性能测试 &#xff08;四&#xff09;一些注意事项1、开发板…

爬虫-网页基础

HTML 基本语法 HTML&#xff1a;Hyper Text Markup Language, 超文本标记语言&#xff0c;是计算机语言的一种&#xff0c;由元素构成。 p元素 <p>Web 真好玩&#xff01;</p> 由三大部分组成 开始标签&#xff1a;一对尖括号中间包裹这元素名称元素内容&#x…

bmpn2中常用网关的介绍和使用

Parallel gateway 在Flowable&#xff08;前身为Activiti&#xff09;中&#xff0c;Parallel Gateway是一种特殊的流程控制结构&#xff0c;用于在流程实例中并行执行多个任务或活动。它分为两种类型&#xff1a;并行拆分网关&#xff08;Parallel Split Gateway&#xff09;…

Qt通过句柄获取其它进程控件实例

1.通过spy获取想要获取控件的句柄id 通过spy获取另一个软件的文本框的句柄 2.Qt写代码&#xff0c; 根据句柄获取文本框的内容 void getTextFromExternalWindow(HWND hwnd) {const int bufferSize 256;TCHAR buffer[bufferSize];// 获取窗口文本内容int length GetWindowT…

14.优化算法之BFS解决FloodFill算法1

0.FloodFill简介 dfs&#xff1a;深度优先遍历&#xff08;红色&#xff09; bfs&#xff1a;宽度优先遍历 1.图像渲染 算法原理 class Solution {int[] dx { 0, 0, 1, -1 };int[] dy { 1, -1, 0, 0 };public int[][] floodFill(int[][] image, int sr, int sc, int color)…

超快的 Python 包管理工具「GitHub 热点速览」

天下武功&#xff0c;无坚不破&#xff0c;唯快不破&#xff01; 要想赢得程序员的欢心&#xff0c;工具的速度至关重要。仅需这一优势&#xff0c;即可使其在众多竞争对手中脱颖而出&#xff0c;迅速赢得开发者的偏爱。以这款号称下一代极速 Python 包管理工具——uv 为例&…