Go语言学习笔记 --- slice切片

Go语言学习笔记05--切片slice与字典map 1.数组案例 //统计输入20个字符中字母出现的个数案例 func checkNumFromInput(){     inputCharArr := [20]byte{},checkNum := [26]byte{}     //输入     for i:=0; i<20; i++{         fmt.Scanf("%c",&inputCharArr[i]);     }   ... 阅读详情

学习笔记根据 无闻 go语言基础教程 整理

slice切片

  • 其本身并不是数组,它指向底层的数组
  • 作为变长数组的替代方案,可以关联底层数组的局部或全部
  • 类型为引用类型
  • 可以直接创建或从底层数组获取生成
  • 使用len() 获取元素个数, cap() 获取容量
  • 一般使用make() 创建
  • 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
  • make([]T,len,cap)
  • 其中cap可以省略,则和len的值相同
  • len表示存数的元素个数,cap表示容量
  • Reslice 时索引以被slice的切片为准
  • 索引不可以超过被slice的切片的容量cap()值
  • 索引月切不会导致底层数组的重新分配而是引发错误
  • 可以在slice尾部追加元素
  • 可以将一个slice追加在另一个slice尾部
  • 如果最终长度未超过追加到slice的容量则返回原始slice
  • 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
  • 示例代码:
package main

import (
    "fmt"
)

func main() {
    test1()
    test2()
    test3()
    test4()
    test5()
    test6()
    test7()
    test8()
    test9()
    test10()
    test11()
}

func test1() {
    var s1 []int
    fmt.Println(s1) // []

}

func test2() {
    a := [5]int{1,2,3,4,5}
    fmt.Println(a) // [1 2 3 4 5]
    s1 := a[2]
    fmt.Println(s1) // 3 此处是取值
    s2 := a[4:5] // 左闭右开 此处是取数组
    s3 := a[4:len(a)]
    s4 := a[4:]
    fmt.Println(s2) // [5]
    fmt.Println(s3) // [5]
    fmt.Println(s4) // [5]
    // 备注 s2, s3, s4 都是从索引为4的位置,取值到最后
}

func test3() {
    a := [5]int{1,2,3,4,5}
    fmt.Println(a) // [1 2 3 4 5]
    s1 := a[:3] // 取前3项,不会包含索引为3的,同样是左闭右开
    fmt.Println(s1) // [1 2 3]
}

func test4() {
    s1 := make([]int, 3, 5) // 初始化3个int放入数组,第三个参数是初始容量
    fmt.Println(s1) // [0 0 0]
    fmt.Println(len(s1),cap(s1)) // 3 5
}

func test5() {
    a := []byte{'a','b','c','d','e','f','g','h','i','j'}
    b := string(a[2:5])
    c := string(a[3:5])
    fmt.Println(b) // cde
    fmt.Println(c) // de
}

func test6() {
    s1 := make([]int, 3, 6)
    fmt.Printf("%p\n", s1) // 0xc042047f50
    s1 = append(s1,1,2,3)
    fmt.Printf("%v %p\n", s1, s1) // [0 0 0 1 2 3] 0xc042047f50 // 此处表明,在未超过最大容量候,操作的都是同一个地址
    s1 = append(s1,1,2,3)
    fmt.Println("cap:", cap(s1)) // cap:12 // 此处可以看到原容量是6,现在就会扩大一倍,每次都是一倍一倍的增长,地址也是重新分配
    fmt.Printf("%v %p\n", s1, s1) // [0 0 0 1 2 3 1 2 3] 0xc0420420c0 // 此处地址变化了
}

func test7() {
    a := []int{1,2,3,4,5}
    s1 := a[2:5]
    s2 := a[1:3]
    fmt.Println(s1, s2) // [3 4 5] [2 3] // 可以看出 s1 和 s2 底层共享元素3的,指向的是底层数组的同一个元素
    s1[0] = 9 // 改变这个元素 在s1中是索引为0的数是3,现在变成9
    fmt.Println(s1, s2) // [9 4 5] [2 9]
}

func test8() {
    a := []int{1,2,3,4,5}
    s1 := a[2:5]
    s2 := a[1:3]
    fmt.Println(s1, s2) // [3 4 5] [2 3] // 可以看出 s1 和 s2 底层共享元素3的,指向的是底层数组的同一个元素
    fmt.Println(len(s2),cap(s2)) // 2 4
    s2 = append(s2, 1,1,1) // append 超越s2的容量, 新的内存地址被分配,将不指向同一个底层数组了, 此时就不会被改变
    s1[0] = 9 // 改变这个元素 在s1中是索引为0的数是3,现在变成9
    fmt.Println(s1, s2) // [9 4 5] [2 3 1 1 1]
}

func test9() {
    s1 := []int{1,2,3,4,5,6}
    s2 := []int{7,8,9}
    copy(s1,s2) // 将s2拷贝到s1中
    fmt.Println(s1) // [7 8 9 4 5 6] // 可以看出保持s1的长度
}

func test10() {
    s1 := []int{1,2,3,4,5,6}
    s2 := []int{7,8,9}
    copy(s2,s1) // 将s1拷贝到s2中
    fmt.Println(s2) // [1 2 3] // 可以看出保持上s2的长度
}

func test11() {
    s1 := []int{1,2,3,4,5,6}
    s2 := []int {7,8,9,10,1,1,1,1,1}
    copy(s2[2:4], s1[1:3])
    fmt.Println(s2) // [7 8 2 3 1 1 1 1 1]
}
ICCompiler II实战:从NDM生成到APR流程的完整避坑指南 本文是一份针对ICCompiler II(ICC II)后端物理实现流程的实战避坑指南。文章详细解析了从NDM库生成、设计初始化、布局规划到时钟树综合与布线的完整APR流程,重点分享了各环节的常见陷阱、精细化配置命令与调试经验,旨在帮助工程师高效达成PPA目标,确保设计一次成功。 阅读详情

相关推荐

从Arduino IDE到Atmel Studio:ATmega328P开发的进阶之路

本文探讨了从Arduino IDE转向Atmel Studio进行ATmega328P开发的进阶路径。通过对比两者差异,详细介绍了Atmel Studio的环境配置、寄存器操作思维、烧录方法及高级调试功能,帮助开发者突破Arduino的封装限制,实现对单片机底层硬件的精细控制与性能优化,提升嵌入式开发的专业能力。

weixin_29193259的博客 128

Golang 入门 : 切片(slice)

切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合。切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。切片的动态增长是通过内置函数 append() 来实现的,这个函数可以快速且高效地增长切片,也可以通过对切片再次切割,缩小一个切片的大小。因为切片的底层也是在连续的内存块中分配的,所以切片还能获得索引、迭代以及为垃圾回收优化的好处。 本文将介绍 Golang 切片的基本概念和用法,演示环境为 ubuntu 18.04 & go1.10.1。 切片

weixin_44014995的博客 850

RK3566基于Buildroot定制QT开发环境的完整指南

本文详细介绍了如何在RK3566开发板上使用Buildroot定制QT开发环境的完整流程。从基础环境搭建、Buildroot初始配置到QT模块选择与编译验证,提供了实战经验和常见问题解决方案,帮助开发者高效完成嵌入式Linux下的QT开发环境部署。

weixin_26804345的博客 360

go语言学习-数组切片(slice)通过数组赋值或创建详解

go语言中数组切片(slice)创建一般有两种种方式: 数组切片的创建 直接创建: arr := make([]int,10) 基于数据创建 arr := arr2[frist:last] 该切片的元素为从下标为frist的元素开始,到小标位last-1元素,左闭右开 arr := arr2[:] arr := arr2[0:] arr := arr2[0:len(ar...

len_yue_mo_fu的博客 1万+

三极管共集电极放大电路详解:射极跟随器的原理、计算与应用

三极管放大电路是模拟电子技术的基石,常见组态包括共发射极、共基极和共集电极。其中共集电极电路因输入电阻大、输出电阻小、电压增益接近1的特性,常被用作射极跟随器,在信号缓冲、级间隔离和低阻抗负载驱动等场景中发挥关键作用。其核心价值并非电压放大,而是完成阻抗变换,将高内阻信号源转换为低内阻输出,同时保持信号幅值基本不变。理解其静态工作点计算与动态参数推导(如电压增益、输入输出电阻)是设计实用电路的前提。本文结合12V电源下的具体设计实例和仿真验证,梳理了从电路识别、参数计算到工程实践的完整流程,并指出常见设计误

weixin_29193259的博客 379

NR/5G - On demand SI

NR中系统消息如MIB -可用于无线帧同步等,SIB1 -小区物理信道公共配置等,是驻留一个小区所必需获得的信息,这类系统信息小区是进行周期性广播。 在SI的配置中,系统消息分为BroadCasting和non-BroadCasting,BroadCasting类系统消息基站也是周期性进行广播的,而non-BroadCasting类系统消息则是通过一种on-demand的方式,即如果需要读取这类系统消息,那么UE需要先发送请求给基站,基站响应UE之后,再下发系统消息。 ...

6777

【Go】Go 语言切片(Slice)

详解Go语言中的“切片”数据类型

weixin_44211968的博客 1万+

手把手教你用Zemax优化MTF:从‘离焦平衡球差’到高频像差控制的实战技巧

本文详细介绍了如何使用Zemax优化MTF性能,从基础设置到高级技巧的全流程。通过具体案例,讲解了如何利用离焦平衡球差提升中频MTF,以及识别和控制高频像差的方法,帮助光学设计工程师和学生有效提升成像质量。

weixin_30752699的博客 753

Go基础——Slice切片

Go基础——Slice切片 羊羽share关注 2018.01.11 01:16*字数 1677阅读 955评论 0喜欢 2 概述 1.切片是引用类型,数组和切片有着紧密的关联,slice的底层是引用一个数组对象。 2一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址。 3切片的长度是变化的,而数组的长度是固定不变的。 声明Sli...

jfkidear的专栏 407

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。涵盖环境配置、本体结构设计、实例填充到可视化展示的全流程,特别适合初学者快速掌握知识建模技术。通过实战案例演示,帮助读者理解如何定义类、属性及建立实例关系,是学习知识图谱构建的实用教程。

weixin_42548816的博客 555

服务器被矿工入侵记录

一次服务器被矿工入驻的处理记录

王瑞的技术专栏 1334

[Go] slice切片详解

Go 中的切片本质上是一个结构体,包含以下三个部分: 切片的扩容 切片在初始化的时候长度等于容量,当向切片添加元素时切片的长度就会大于容量,此时就会为其分配一个新的底层数组 在该示例中,初始化切片的长度为3,容量也为3,切片的底层数组的地址为0xc0000120a8,当向其添加一个元素后,切片的容量为6,并指向了一个新的地址0xc00000c360我们可以使用make()创建一个容量大于长度的切片,这样在向切片添加元素时,长度就不会超过容量,就不会分配新的数组 在该示例中,我们使用创建了一个长度为3,容量

polarday的博客 1117

Buck电源设计常见的一些问题(五)MOS管振荡抑制方法(三)

关于开关节点振荡的产生机制和抑制问题,总结了三种抑制方法。第一种方法是利用输入端的高频去耦电容;第二种方法是设计 RC 缓冲电路;第三种方法是优化自举电路的串联电阻。以上三种方法均通过实验加以验证,对开关节点振荡具有很好的抑制作用。应该综合同步 Buck 变换器的各项指标权衡设计。

小幽余生不加糖 1634

GO语言学习笔记(五、切片slice)

切片Slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数,cap()获取容量 一般使用make()创建 如果多个slice指向相同底层数组,其中一个的值改变会影响全部 make([]T,len,cap) 其中cap可以省略,则和len的值相同 len表示存数...

分享AI、区块链技术及应用,未来已来 254

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

(四)Go语言学习笔记 - Slice切片、map映射

Go语言学习笔记3.9 Slice(切片)3.9.1 attention3.9.2 example3.9.2.1 exa13.9.2.2 exa23.9.2.3 exa33.9.2.4 exa43.9.3 字符串切片3.9.4 slice_copy3.9.5 slice_append 3.9 Slice(切片) 3.9.1 attention 切片的基本介绍 (1)切片的英文是slice (2)切...

RSQ博客 1074

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Go语言学习笔记十一: 切片(slice)

Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用。不像java语言写起来就比较繁琐。不过我觉得未来java语法也会支持的。 定义切片 切片可以使用make函数来定义,也可以像变量声明一样创建个未指定大小的切片。 var x []int = make([]int, 3); y := make([]int, 3); z...

kriszhang的博客 495

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Go语言学习——slice及其底层逻辑

切片是用来描述底层数组的连续片段的数据结构,定义于runtime包中,本身并不保存数组数据,而只是保存数组连续片段的描述信息。通过结构体里的 array 段指针引用底层数组,长度和容量属性限制底层数组的读写片段。

jiajixi的博客 1082

Go语言基础:切片slice的声明及使用

go语言基础: 切片的声明和使用

低调,谦虚,自律,反思,成长,保持热爱,奔赴梦想 2099

Go语言学习8:深入理解切片slice

slice定义 slice是个结构体,源码如下: // runtime/slice.go type slice struct { array unsafe.Pointer // 元素指针 len int // 长度 cap int // 容量 } slice 共有三个属性: 指针,指向底层数组; 长度,表示切片可用元素的个数,也就是说使用下标对 slice 的...

login_sonata的博客 688

go语言Slice的底层

本文通过一个Go语言切片案例,深入分析了切片的底层机制和传递特性。

2402_88103396的博客 1249

【Go语言学习】切片Slice的扩容机制

扩容后容量变化 向切片新增一个元素时,若该切片容量已满,会首先根据切片容量进行判断,小于1024字节扩容为原有容量的2倍,大于1024字节扩容为原有容量的1.25倍 扩容前容量小于1024 func main(){ array := [4]int{10, 20, 30, 40} oldSlice := array[:] fmt.Printf("len = %d, cap = %d\n", len(oldSlice), cap(oldSlice)) newSlice := append(oldSlic

Eric_zhang929的博客 986

Go 语言学习之 切片(slice)

切片

As_wind_的博客 878

go语言学习笔记之slice用法

一、slice的概念: Slices(切片)slice是概念上一个结构包含三个域:一个数组的指针、长度和容量。切片支持[]操作符来访问底层数组的元素。内置的len函数返回的切片长度。内置的的cap函数返回切片的容量。 切片是引用类型,这意味着如果你将一个切片赋值给另外一个切片,这两个切片将引用同一个底层数组。 二、如何创建slice 创建切片可用以下两种方法: (1)直接创建: s :

博学而笃志,切问而近思 2万+

go int 转切片_Go 语言学习之 slice

01概念slice 是有 3 个字段的数据结构,这些数据结构包含 Go 语言需要操作底层数组的元数据,这 3 个字段分别是指向底层数组的指针,切片的长度和切片的容量。指针指向数组的第一个可以从 slice 中访问的元素,这个元素并不一定是数组的第一个元素,长度是指 slice 中元素的个数,它不能超过 slice 的容量。容量的大小通常是从 slice 的起始元素到底层数组的最后一个元素...

weixin_42159267的博客 365

Go语言学习笔记2——数组和Slice

在任何一门语言里,数组应该都是非常基础的类型了,使用率当然也应该是很高的。go不但提供了数组,而且还在数组这个类型之上加了一层包装,这个包装也就是slice。         go的数组变量(也就是数组名)是真真实实的数组,而不是一个指向数组内存起始位置的指针,也不能和同类型的指针进行转化,这一点严重不同于C语言; C语言主要还是类型系统太弱了,因此很多的数据最终都退化为指针的方式来访问。

可乐爱上咖啡 2万+

go语言学习 slice切片

定义 切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。 func main() { // 声明切片类型 var a []string //声明一个字符串切片 var b = []int{} //声明一个整型切片并初始化 var c = []bool{false, true} //声明一个

flyconley的博客 296
上一篇: Go语言学习笔记 --- 数组的使用
下一篇: 考研英语 - word-list-34
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值