三天Golang快速入门—Slice切片

news/2025/3/15 18:27:13/

三天Golang快速入门—Slice切片

  • Slice切片
    • 切片原理
    • 切片遍历
    • append函数操作切片
      • append添加
      • append追加多个
      • 切片中删除元素
      • 切片合并
    • string和slice的联系

Slice切片

切片原理

  • 由三个部分构成,指针、长度、容量
  • 指针:指向slice第一个元素对应的数组元素的地址
  • 长度:slice元素的数量,不能超过容量
  • 容量:selice开始的位置到底层数据的结尾
package mainimport "fmt"func main() {//创建一个数组var array1 [5]int = [...]int{11, 22, 33, 44, 55}/*创建切片,通过对数组的索引切片s1是切片名array1[1:3]代表slice引用数组区间,索引1到索引3的值,注意取头不取尾,*/s1 := array1[1:4]fmt.Println(array1)fmt.Println(s1)fmt.Println(len(s1))fmt.Println(cap(s1))}
//结果
[11 22 33 44 55]     //原本数组
[22 33 44]            //切片的值
3                    //切片元素长度
4                    //切片容量

需要说明:slice并不是数组或数组指针。只是通过内部指针和相关属性引用数组片段,实现可动态变化的序列。所以切片只是对数组的一个引用,是引用类型

//1.声明切片
var a []int
//2. 类型推导声明并初始化切片
b := []int{}
//3. make创建切片
// 内置make函数,参数(类型,len,cap)cap必须大于len,容量可以省略,默认等于长度
var c []int = make([]int,0)
//4.从数组切片
d := [5]int{1,2,3,4,5}
var d2 []int
d2 = d[1:4]

在这里插入图片描述

切片遍历

和数组的变量是一样的

package mainimport "fmt"func main() {arr := [5]int{11, 22, 33, 44, 55}s1 := arr[1:4]// for循环for i := 0; i < len(s1); i++ {fmt.Printf("s1[%v]=%v\n", i, s1[i])}fmt.Println()// for range方式for i, v := range s1 {fmt.Printf("索引i=%v 值v=%v\n", i, v)}}

append函数操作切片

  • append可以为切片动态添加元素,每个切片会指向一个底层数组
  • 当底层数组不能容纳新增的元素时,切片会自动进行扩容,重新指向一个新的底层数据,且以2倍的容量重新分配数组

append添加

package mainimport "fmt"func main() {var numSlice []intfor i := 0; i < 10; i++ {numSlice = append(numSlice, i)fmt.Printf("%v len:%d cap:%d ptr:%p\n", numSlice, len(numSlice),cap(numSlice), numSlice)}}
/*
[0] len:1 cap:1 ptr:0xc0000140a8
[0 1] len:2 cap:2 ptr:0xc0000140f0                  
[0 1 2] len:3 cap:4 ptr:0xc00000e200                
[0 1 2 3] len:4 cap:4 ptr:0xc00000e200              
[0 1 2 3 4] len:5 cap:8 ptr:0xc000018280            
[0 1 2 3 4 5] len:6 cap:8 ptr:0xc000018280          
[0 1 2 3 4 5 6] len:7 cap:8 ptr:0xc000018280        
[0 1 2 3 4 5 6 7] len:8 cap:8 ptr:0xc000018280      
[0 1 2 3 4 5 6 7 8] len:9 cap:16 ptr:0xc000102000
*/

append追加多个

package mainimport "fmt"func main() {var citySlice []stringcitySlice = append(citySlice, "上海")             // 追加一个元素citySlice = append(citySlice, "北京", "广州", "杭州") // 追加多个元素a := []string{"成都", "重庆"}citySlice = append(citySlice, a...) // 追加切片fmt.Println(citySlice)
}
/*
[上海 北京 广州 杭州 成都 重庆]
*/

切片中删除元素

package mainimport "fmt"func main() {a := []int{10, 11, 20, 21, 22, 40}a = append(a[:2], a[3:]...) //删除索引为2的元素fmt.Println(a)
}
//[10 11 21 22 40]

切片合并

package mainimport "fmt"func main() {a1 := []int{2, 4, 8}a2 := []int{1, 3, 7}a1 = append(a1, a2...)fmt.Println(a1)
}
//[2 4 8 1 3 7]

string和slice的联系

//string底层就是byte数组 因此string同样可以进行切片处理
package main
import "fmt"
func main() {str1 := "yugo niubi"//对str1进行切片s1 := str1[:4]fmt.Println(s1)//yugo
}2)stirng修改的两种方式
package main
import ("fmt"
)
func main() {str1 := "yugo niubi"//string是不可变的,也无法通过切片修改值//str1[0] = 's'  编译器失败//修改string的方法,需要string转化为[]byte,修改后转为stringarr1 := []byte(str1) //类型强转arr1[0] = 'g'str1 = string(arr1)fmt.Printf("str1=%v\n", str1)//[]byte只能处理英文和数字,不能处理汉字,汉字3个字节,会出现乱码//将string转为[]rune,按字符处理,兼容汉字arr2 := []rune(str1)arr2[0] = '于'str1 = string(arr2)fmt.Printf("str1=%v\n", str1)
}

http://www.ppmy.cn/news/29066.html

相关文章

STM32C0介绍(1)----概述

概述 STM32C0系列微控制器是意法半导体公司推出的一款低功耗、高性能的微控制器产品。它们被设计用于需要小型、低功耗和高度可集成的应用程序&#xff0c;如传感器、消费品、电池供电设备、家庭自动化和安全等应用。该系列的微控制器采用ARM Cortex-M0内核&#xff0c;具有丰…

记--springboot-工具类中使用@Component、@Resource与@Value失效

写一个工具类 需要使用Resource注入RedisTemplate 使用Value获取application.properties配置文件中配置 并使用Component将该工具类交个spring管理 调试的时候RedisTemplate以及所有的变量全是是null 看了网上的各种解决方式五花八门 有的说出现问题的原因&#xff1a;Compon…

Grafana邮件及告警配置

之前部署过服务器的监控组件程序&#xff0c;本在部署时也进行邮件及告警配置&#xff0c;但未进行文档整理&#xff0c;在这儿进行展示。之前用过Grafana的7.*的版本&#xff0c;在进行邮件配置还比较OK&#xff0c;但在配置告警时&#xff0c;太繁琐&#xff0c;还要自己去写…

【STM32】入门(十二):实时操作系统RTOS和通用操作系统GPOS的区别

1、简述 实时操作系统(RTOS&#xff0c;Real Time Operating System) 通用操作系统(GPOS&#xff0c;General Purpose Operating System) 2、区别 1&#xff09;任务 实时操作系统&#xff1a;使用分时设计&#xff0c;其中每个任务被分配一小段时间&#xff0c;在切换到另一…

数据结构之单链表

文章目录前言&#xff1a;一.链表的概念及结构1.何为链表2.链表常见的几种形式二.无头单向非循环链表的实现1.定义节点2.创建一个新节点3.单链表打印4.单链表尾插5.单链表尾删6.单链表头插7.单链表头删8.单链表查找9.在pos之前插入10.在pos之前删除11.在pos之后插入12.在pos之后…

IPv4地址细讲

文章目录一、IPv4地址简介二、IPv4地址的表示方法点分十进制记法三、IP地址的分类四、特殊IPv4地址&#xff1a;全 “0” 和全 “1”五、常用的三类IP地址使用范围六、五类IP地址的范围一、IPv4地址简介 IPv4地址分5类&#xff0c;每一类地址都由固定长度的字段组成&#xff1…

k8s ConfigMap 中 subPath 字段和 items 字段

Kubernetes中什么是subPath 有时&#xff0c;在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 属性可用于指定所引用的卷内的子路径&#xff0c;而不是其根路径。 这句话理解了&#xff0c;基本就懂subPath怎么用了&#xff0c;比如我们要替换nginx.cnf, 挂…

STM32开发(17)----CubeMX配置CRC

CubeMX配置CRC前言一、什么是CRC&#xff1f;二、实验过程1.STM32CubeMX配置2.代码实现重载printf3.实验结果总结前言 本章介绍使用STM32CubeMX对CRC进行配置的方法&#xff0c;CRC的目的是保证数据的完整性&#xff0c;所有的STM32芯片都内置了一个硬件的CRC计算模块&#xf…