go中的切片

带隙基准电路实战:温度补偿与流片调优全解析 带隙基准(BGR)是模拟芯片中实现高精度、低温漂电压参考的核心电路,其本质是利用硅材料禁带宽度的物理稳定性,通过PTAT(正温度系数)与CTAT(负温度系数)电压的加权叠加抵消温度影响。原理上需兼顾一阶线性补偿与二阶曲率校正,技术价值在于支撑ADC/DAC/LDO等关键模块的精度与可靠性。典型应用场景涵盖车规级MCU、工业传感器和高精度电源管理芯片。工程落地难点集中于工艺偏差、运放失调、寄生效应及版图热电耦合——这正是‘带隙基准设计’与‘带隙基准调优’的根本分野。本文聚焦真实流片经验,深入拆解Widlar架 阅读详情

demo1:切片定义的几种方式

package main

import "fmt"

/*
切片定义的几种方式

数组和切片区别:
使用数组传参是值传递,而使用切片传参是引用传递
数组定义好长度之后不可修改,而切片可以理解为动态数组,长度可修改

*/

func main() {
    //方法1:直接创建
    s1 := []string{"1", "2", "3"}
    fmt.Printf("%T\n", s1)
    fmt.Println(len(s1))
    fmt.Println(s1)

    fmt.Println("--------------------------------------")
    //方法2:使用make定义,但是需要加上长度,cap可加可不加
    s2 := make([]string, 3)     //s2:=make([]string, 3,5)   加cap写法
    fmt.Printf("%T\n", s2)
    fmt.Println(len(s2))
    fmt.Println(s2)

    fmt.Println("--------------------------------------")
    //方法3:数组变切片
    arr := [3]string{"1", "2", "3"}
    s3 := arr[1:2]
    fmt.Printf("%T\n", s3)
    fmt.Printf("%T\n", arr)
    fmt.Println(len(s3))
    fmt.Println(s3)

    fmt.Println("--------------------------------------")
    //方法4:new
    s4 := new([]string)
    fmt.Printf("%T\n", s4)
    //fmt.Println(len(s4)) //没有长度
    fmt.Println(s4) //&[]

}

demo2: 切片的基本操作

package main

import "fmt"

/*
切片的基本操作:添加、复制、合并、删除
*/

func main() {
    s1 := []string{"1", "2", "3"}

    //添加
    s1 = append(s1, "4", "5")
    fmt.Println(s1)

    //复制
    s2 := []string{}
    copy(s2, s1)
    fmt.Println(s2) //这里s2为空,因为没定义长度
    //拷贝时,目标对象长度为多少就只能复制多少
    s3 := make([]string, len(s1))
    copy(s3, s1)
    fmt.Println(s3)

    //把两个切片合并
    s2 = append(s1, s3...) //省略号是规定的参数
    fmt.Println(s2)

    //数组中删除元素:先把数组变成切片,再把两个切片合并
    s4 := s2[:]
    s4 = append(s2[0:2], s2[4:]...)
    fmt.Println(s4)
}

demo3: 切片的cap和len

package main

import "fmt"

/*
切片的容量(cap)和长度(len)

slice的底层是使用数组实现的,同一个数组的切片会共享内存,但如果切片扩容超过切片的原有容量cap会触发扩容机制,该切片就会自己独立开辟全新内存空间。

slice的append扩容问题:扩容阶段因为需要整体开辟全新的内存空间,因此扩容阶段会影响速度。python的list中底层实际上也是数组,也会面临扩容影响速度的问题。

python的同一list中可以存不同的数据类型。
*/

func main() {
    //不设置cap时,len和cap大小一致
    s1 := []string{"1", "2", "3"}
    fmt.Println(len(s1))    //3
    fmt.Println(cap(s1))    //3

    s2 := make([]int, 5)    
    fmt.Println(len(s2))    //3
    fmt.Println(cap(s2))    //3

    s3 := make([]int, 5, 8) //设置了容量cap
    fmt.Println(len(s3))    //5
    fmt.Println(cap(s3))    //8

    //通过数组取切片:cap为切片起始位置之后的数组长度
    s4 := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    s5 := s4[2:5]        
    fmt.Println(len(s5)) //3
    fmt.Println(cap(s5)) //8

    //append函数遇到make问题:如果用make创建切片时定义了长度,append操作会在原有元素之后进行插入。如果没有定义长度,append操作则是对默认元素0进行替换
    s6 := make([]int, 3)
    s6 = append(s6, 1)
    fmt.Println(s6) //[0 0 0 1]

    s7 := make([]int, 0)
    s7 = append(s7, 1)
    fmt.Println(s7) //  [1]

}

demo4:切片扩容

案例1:

package main

import (
    "fmt"
)

func main() {

    data := [...]int{0, 1, 2, 3, 4, 10: 0} //数组
    s := data[:2:3]
    fmt.Println(s)
    fmt.Println(len(s), cap(s))

    s = append(s, 100, 200, 300) // 一次 append 三个值,超出 s.cap 限制。

    fmt.Println(s, data)         // 重新分配底层数组,与原数组无关。
    fmt.Println(&s[0], &data[0]) // 比对底层数组起始指针。

}

从输出结果可以看出:append 后的 s 被重新分配了底层数组(也就是说 s 的底层数组不再是 data,那么修改 s 的值不会再影响 data,它们不再有关联),并把原数组中的值拷贝到新数组中。这是因为超出了原切片的容量。在上例中,如果只追加一个值,则不会超过 s.cap 限制,也就不会重新分配。

切片的自动扩容策略是这样的:(文章:简单说说go语言Slice的底层实现_Liuzhiwang29的博客-优快云博客 简单说说go语言Slice的底层实现 通过分析源码对这一点提出了质疑)通常 以 2 倍容量 进行扩容,并重新分配底层数组(新底层数组的容量也变大)。如果切片的容量小于 1024 个元素,扩容的时候就翻倍增加容量。一旦元素个数超过 1024 个元素,那么增长因子就变成 1.25 ,即每次增加原来容量的四分之一。注意:扩容扩大的容量都是针对原来的容量而言的,而不是针对原来数组的长度而言的。

所以,在大批量添加数据时,建议 一次性分配足够大的空间 ,以减少内存分配和数据复制开销。或 初始化足够长的 len 属性,改用索引号进行操作。及时释放不再使用的 slice 对象,避免持有过期数组,造成 GC 无法回收。

slice中 cap 重新分配规律:

package main

import (
    "fmt"
)

func main() {

    s := make([]int, 0, 1)
    fmt.Println(s)
    
    c := cap(s)                        //计算容量
    fmt.Println(c)

    for i := 0; i < 50; i++ {
        s = append(s, i)               //按理说 append 第2个元素时就超出了cap,这时会重新分配底层数组来扩大cap
        if n := cap(s); n > c {
            fmt.Printf("cap: %d -> %d\n", c, n)
            c = n
        }
    }

}

输出结果:

[]
1
cap: 1 -> 2
cap: 2 -> 4
cap: 4 -> 8
cap: 8 -> 16
cap: 16 -> 32
cap: 32 -> 64

我们可以发现,通常以 2 倍的 cap 重新分配。

提一嘴哈,如果给切片 append 元素时,不超切片容量就没事,操作的还是原数组:

package main

import (
    "fmt"
)

func main() {

    data := [...]int{0, 1, 2, 3, 4, 10: 0} //数组
    s := data[:2:5]                        //将切片容量扩大到5
    fmt.Println(s)
    fmt.Println(len(s), cap(s))

    s = append(s, 100, 200, 300) // 一次 append 三个值,这次没超出 s.cap 限制。

    fmt.Println(s, data)         
    fmt.Println(&s[0], &data[0]) // 比对底层数组起始指针

}

输出结果:

[0 1]
2 5
[0 1 100 200 300] [0 1 100 200 300 0 0 0 0 0 0]
0xc00004a060 0xc00004a060

案例2:

package main

import "fmt"

//slice的扩容

func main() {
    arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
    s1 := arr[2:6]      
    s2 := s1[3:5]
    fmt.Printf("s1=%v,len(s1)=%d,cap(s1)=%d\n", s1, len(s1), cap(s1)) //2,3,4,5
    fmt.Printf("s2=%v,len(s2)=%d,cap(s2)=%d\n", s2, len(s2), cap(s2)) //5,6,为什么s2中取到6,是因为slice支持向后扩容

    //slice的操作:向slice中添加元素
    s3 := append(s2, 10)
    s4 := append(s3, 11)
    s5 := append(s4, 12)
    fmt.Println("s3,s4,s5:", s3, s4, s5)
    fmt.Println("arr:", arr)    //为什么没有11,12?   是因为不能超过cap,如果超过cap则会重新分配一个数组进行存储

}

基于STM32设计的电能质量控制系统_353 本项目基于STM32F103RCT6微控制器设计了一套电能质量控制系统,实现了对火焰、烟雾、环境温湿度、电压、电流及功率等多项参数的实时监测与报警。系统通过MQ2烟雾传感器、火焰传感器、SHT30温湿度传感器及电力参数采集模块采集数据,采用高电平触发有源蜂鸣器进行异常报警。采集的数据通过ESP8266无线模块以AP+TCP模式上传至基于Qt开发的手机APP和电脑上位机,实现远程实时监控和历史数据管理。系统配备1.44寸LCD显示屏,实现本地数据显示。软件采用Keil5开发,采用寄存器编程方式,提高系统响应速 阅读详情

相关推荐

WRF后处理总结:wrf-python与NCL在WRF后处理中的基本应用——变量提取、计算与可视化

判断需要提取的变量与诊断量确定后,使用getvar函数进行提取。可使用ncdump-h命令查看wrfout中的变量,wrf中的诊断量分类也可从官方文档处查阅。判断绘图类型所需的可视化绘图类型,决定了你在WRF后处理中的计算步骤。1D点线图:ll_to_xy interpline2D填色图:interplevel3D剖面图:vinterp vertcross绘图、美化色标、XY轴、标签的设置等等。

weixin_43750300的博客 1万+

go的切片的输入输出以及标准输入输出

博客主页:🏆看看是李XX还是李歘歘🏆 🌺每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今天的内容是 go的输入输出 ⛽️💻💻💻 标准的输入输出: 按值读取 package main import "fmt" func main() { // 读入一个值,空格和换行都算分隔符 var input1, input2 string fmt.Scanf("%v"...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 2651

【Ragflow】9.问答为什么比搜索响应慢?从源码角度深入分析

前几天看到有群友提到一个现象:Ragflow的搜索界面的问答速度很快,但聊天界面的问答速度很慢,究竟是什么原因?在深入挖掘源码之后,逐渐发现了问题的答案。

兴趣使然的创作者 2898

go语言之“输出一组切片查看其容量“

var a = make([]int, 5, 10) //创建切片,长度为5,容量10 fmt.Println(a) for i := 0; i < 10; i++ { a = append(a, i) } fmt.Println(a) fmt.Println(cap(a))

weixin_44961320的博客 320

细胞膜电学特性的分数阶微积分建模

分数阶微积分在细胞膜电学特性建模中的应用主要体现在对细胞膜的电容行为和神经元放电活动的更精确描述上。

冰河世纪20的博客 619

Linux系统搭建OpenClaw(原Clawdbot)全流程指南 最新版

工具定位:开源个人 AI 助手,支持文件读取、命令执行、多渠道交互(Telegram / 本地终端等);系统要求:主流 Linux 发行版(Ubuntu/Debian/CentOS 等),Node.js ≥22(核心依赖);安全提示:OpenClaw 为测试版,具备高权限操作能力,建议使用非主力机,配置权限白名单,避免接触敏感数据。

AI时代老码农的第二春 6559

golang之切片的操作详解

基础知识: -其本身并不是数组,silce指向底层的数组 -作为变长数组的替代方案,可以关联底层数组的局部与全部 -为引用类型 -可以直接创建或从底层数组获取生成 -使用len()获取元素个数,cap()获取容量 -若果多个silce指向相同底层数组,其中一个的值改变会影响全部 声明:make([] T,len,cap) 切片使用:欺骗默认指向一段连续内存区域,可以使数组,也可以是...

spc15051962859的博客 1万+

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

Go语言切片

目录 内部实现 声明切片 初始化数组 切片内存结构 使用切片 迭代切片 切片重组 在函数间传递切片 new()和make()的区别 字符串、数组和切片的应用 从字符串生成字节切片 ...

weixin_30553777的博客 632

大麦网抢票软件工具开发系列(一)

前言《大麦网》都知道吧,就是那个被网友声称“大麦网你卖啥了?”票务平台。近期有听到朋友说《大麦网》的票很难抢,基本上都是说:“哎哟喂,被挤爆啦,请稍后重试!”,也不知道《大麦网》...

架构文摘 1万+

使用LaTex写IEEE trans 论文的参考文献(bib)

(1)在.TeX文件的最下方添加这几行内容,主要为生成tran形式的参考文献,第二行为参考文献名称,我命名为reference.bib,所以写的是reference,要根据自己的命名改写。(5)如果要在文中引用的话,就在.tex文件中添加\cite{},中括号里面内容为方框圈出来部分,但引用之后,在参考文献后面会出现[1]这样的标识,不知道为什么。(4)完成(3)以后,点击工具-命令-LaTeX,编译,然后按照此步骤LaTeX-bibtex-LaTeX-LaTeX,就可以完成参考文献的导入。

qq_45884215的博客 6258

golang 数组和切片_了解Go中的数组和切片

golang 数组和切片 介绍 (Introduction) In Go, arrays and slices are data structures that consist of an ordered sequence of elements. These data collections are great to use when you want to work with many rel...

1239

YOLOv13改进策略【多YAML融合】| HWD + DSC3k2_PConv + Detect_MBConv

本文记录的是利用HWD + DSC3k2_PConv + Detect_MBConv改进YOLOv13,分别涉及骨干、颈部和检测头部分的改进。一方面按照此配置,其工作量及创新程度能够满足论文发表的需求,另一方面是一些难以融合多个YAML的举例,以帮助大家理解如何将多个YAML整合到一个YAML中。小波下采样:一个简单但有效的语义分割下采样模块。块由两个主要块组成:无损特征编码块和特征表示学习块。HWD模块与其他下采样模块对比:保留信息能力:传统的下采样方法(如最大池化、平均池化和步幅卷积等)会导致信息丢失,

Limiiiing的博客 495

golang 切片 接口_一文搞懂Go语言中的切片排序

本文首发于“Gopher部落”知识星球!切片是Go语言中引入的用于在大多数场合替代数组的语法元素。切片是长度可变的同类型元素序列,它不支持存储不同类型的元素,当然如果你非用sl := []interface{}{"hello", 11, 3.14}来抬杠^_^,那就另当别论。有序列的地方就有排序的需求。在各种排序算法都已经成熟的今天,我们完全可以针对特定元素类型的切片手写排序函数/方法,但多数情况...

weixin_40005330的博客 305

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

golang 切片和数组_go中的切片和数组的初学者指南

golang 切片和数组When I was learning the fundamentals of Go, I was surprised to find that Go does not have rich built-in libraries around the collections such as Arrays, Maps, etc.. One reason is that comi...

weixin_26714375的博客 360

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Go语言】Go语言中的切片

因此,Go语言中的切片是一个可变长度的、同一类型元素集合,切片的长度可以随着元素数量的增长而增长,但不会随着元素数量的减少而减少,但切片底层依然使用数组来管理元素,可以看作是对数组做了一层简单的封装。切片与数组相比,优势在于支持动态增加元素,甚至能够在容量不足的情况,在切片类型中,元素个数和实际可分配的存储空间是两个不同的值,元素的个数即切片的实际长度,而可分配的存储空间就是切片的容量。切片可以基于一个已存在的数组创建,切片可以只使用数组的一部分元素或者全部元素,甚至可以创建一个比数组更大的切片。

Python、Golang、大数据 3022

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Golang中的数组和切片

(4)数组可以作为参数传递给函数,但是因为数组的长度是固定的,因此数组的长度也需要作为参数传递;切片可以直接作为参数传递给函数,不需要指定长度。(2)数组是值类型,将一个数组赋值给另一个数组时,会将所有的元素进行复制;切片是引用类型,将一个切片赋值给另一个切片时,它们将共享底层数组。(3)数组可以使用==运算符进行比较,切片不能使用==运算符进行比较。(1)数组的长度固定,切片的长度是动态的。

周小末天天开心的博客 1050

go 切片释放内存_golang:理解 Go 中的类型

在 Go 语言官方文档中,你可以找到很多关于指针和内存分配的重要信息。以下是该文档的链接:Go 语言官方文档之指针首先我们需要理解的是,所有在 Go 语言中的值都有其不同变量来表示。不同类型表示的变量决定了我们如何使用它来操纵内存。这篇文章阐述了更多关于 Go 语言中的变量类型:理解 Go 中的类型在 Go 中,我们可以创建一个变量作为 “值” 本身,也可以创建一个变量作为某个 “值” 的地址。当...

weixin_39617502的博客 962

深入理解go语言中的切片

本文通过切片的创建结合汇编码了解的切片底层数据结构和创建过程,再通过代码示例结合源码的方式了解了切片的动态扩容机制,了解切片在扩容时如何在空间和时间上实现折中,希望对你有帮助。都说切片会动态扩容,这里我们创建一个容量为10的切片,在容量以内添加元素,其容量和size都没有变化,一旦追加元素就会触发扩容,可以看到此时已用。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。若新的长度大于容量的2倍则判断旧的容量是否超。

禅与计算机程序设计的艺术 857

golang中的切片

slice 注意,切片代表的窗口是无法向左扩展的顺便提一下把切片的窗口向右扩展到最大的方法。对于s4来说,切片表达式s4[0:cap(s4)]就可以做到 一个切片的容量可以被看作是透过这个窗口最多可以看到的底层数组中元素的个数 切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长方案 slice并不是真正意义上的动态数组,而是一个引用类型.slice总是指向一个底层array, slice的声明也可以像array一样,只是不需要长度 可以把切片看做是对数组的一层简单的封装,因为

456

Go 语言中的切片:灵活的数据结构

切片是对底层数组的连续片段的引用,使得切片成为了引用类型。它的长度可以在运行时改变,其长度永远不会超过其容量,即。切片的灵活性在于,你可以使用切片来访问数组的任何连续部分,而无需复制其元素。

栗筝i的博客 4065

Go语言中的切片类型

Go语言中的切片类型  大蟒传奇 关注 2016.12.18 16:02* 字数 2034 阅读 950评论 2喜欢 7赞赏 1 图文无关 本文翻译自Andrew Gerrand的博文 https://blog.golang.org/go-slices-usage-and-internals 前言 Go语言中提供了的切片类型,方便使用者处理类型数据序列。 切片有点像其他语言中的...

jfkidear的专栏 1988

Golang中的切片

切片(Slice)是一个拥有相同类型元素可变长度的序列,它是基于数组类型的一层封装,支持自动扩容 1.切片的声明 var arr1=[]int{1,2,3,4} fmt.Printf("%v %T 长度:%v",arr1,arr1,len(arr1)) // [1 2 3 4] []int 长度:4 var arr2=[]int{1:5,2:10,3:15,5:20} fmt.Printf("%v %T 长度:%v",arr2,arr2,len(arr2)) // [0 5 10 15 0 2

qq_40657299的博客 529

golang修改结构体中的切片值

golang修改结构体中的切片值,直接传结构体地址就可以 package main import "fmt" type rspInfo struct { KeyWords string `json:"key_words"` Value []string `json:"value"` } func setSlice(te *[]string){ str := "12" *te = append(*te,str) } //结构提传指针 func setStruc(rsp *rsp...

1万+
上一篇: go中的数组
下一篇: go中的结构体
Cc_sec
博客等级 码龄8年 6粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值