go基础——切片slice
package main
import "fmt"
/*
切片:
不定长的数组,是引用类型的数据,指向一个底层数组。
*/
func main() {
//切片的创建和访问
var s1 []int
fmt.Println(s1)
s2 := []int{1, 2, 3, 4}
fmt.Println(s2)
s2[0] = 5
fmt.Println(s2)
s3 := make([]int, 3)
/*
make函数可以创建slice,map,chan这三种引用类型
第一个参数是类型,第二个参数是长度len,第三个参数是容量cap(这里省略了)
*/
fmt.Println(s3)
//切片扩容append
s3 = append(s3, 1, 2)
fmt.Println(s3)
s3 = append(s3, s2...) //append另一个切片中的元素
fmt.Println(s3)
//遍历切片
for i := 0; i < len(s2); i++ {
fmt.Println(s2[i])
}
for i, v := range s2 {
fmt.Println(i, v)
}
//切片扩容原理
/*
新建一个len=3,cap=3的切片
append两个值时,这时切片指向一个新的cap=6的底层数组,并把前一个数组的值复制给新数组。
元素个数再次增大超过6时,成倍扩容为cap=12。
slice本身不存储数据,指向的数组存储数据,切片变化cap靠改变指向的数组实现。
*/
sli1 := make([]int, 3)
fmt.Printf("len:%d,cap:%d,切片地址:%p,数组地址:%p\n", len(sli1), cap(sli1), &sli1, sli1)
sli1 = append(sli1, 1, 2)
fmt.Printf("len:%d,cap:%d,切片地址:%p,数组地址:%p\n", len(sli1), cap(sli1), &sli1, sli1)
sli1 = append(sli1, 3, 4)
fmt.Printf("len:%d,cap:%d,切片地址:%p,数组地址:%p\n", len(sli1), cap(sli1), &sli1, sli1)
//在已有array上直接创建slice
arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
sli2 := arr[:5] //1-5
sli3 := arr[3:8] //4-8
sli4 := arr[5:] //6-10
sli5 := arr[:] //1-10
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Printf("len:%d,cap:%d,数组地址:%p\n", len(sli2), cap(sli2), sli2)
fmt.Println("sli3:", sli3)
fmt.Printf("len:%d,cap:%d,数组地址:%p\n", len(sli3), cap(sli3), sli3)
fmt.Println("sli4:", sli4)
fmt.Printf("len:%d,cap:%d,数组地址:%p\n", len(sli4), cap(sli4), sli4)
fmt.Println("sli5:", sli5)
fmt.Printf("len:%d,cap:%d,数组地址:%p\n", len(sli5), cap(sli5), sli5)
//更改数组或切片内容
fmt.Println("=========更改数组==========")
arr[7] = 100
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Println("sli3:", sli3)
fmt.Println("sli4:", sli4)
fmt.Println("sli5:", sli5)
fmt.Println("=========更改切片==========")
sli2[4] = 200
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Println("sli3:", sli3)
fmt.Println("sli4:", sli4)
fmt.Println("sli5:", sli5)
fmt.Println("=========append切片(未超过数组cap)==========")
sli2 = append(sli2, 0, 0, 0) //修改了数组的5-7位数值
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Println("sli3:", sli3)
fmt.Println("sli4:", sli4)
fmt.Println("sli5:", sli5)
fmt.Println("=========append切片(超过数组cap)==========")
sli4 = append(sli4, 99, 99, 99) //新建了一个底层数组
sli4[4] = 111 //再修改sli4不会对原数组有影响了
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Println("sli3:", sli3)
fmt.Print("sli4:", sli4)
fmt.Printf("\tlen:%d,cap:%d\n", len(sli4), cap(sli4))
fmt.Println("sli5:", sli5)
}
执行结果
[]
[1 2 3 4]
[5 2 3 4]
[0 0 0]
[0 0 0 1 2]
[0 0 0 1 2 5 2 3 4]
5
2
3
4
0 5
1 2
2 3
3 4
len:3,cap:3,切片地址:0xc0000040f0,数组地址:0xc000012210
len:5,cap:6,切片地址:0xc0000040f0,数组地址:0xc00000a420
len:7,cap:12,切片地址:0xc0000040f0,数组地址:0xc00001a1e0
arr: [1 2 3 4 5 6 7 8 9 10]
sli2: [1 2 3 4 5]
len:5,cap:10,数组地址:0xc00000c1e0
sli3: [4 5 6 7 8]
len:5,cap:7,数组地址:0xc00000c1f8
sli4: [6 7 8 9 10]
len:5,cap:5,数组地址:0xc00000c208
sli5: [1 2 3 4 5 6 7 8 9 10]
len:10,cap:10,数组地址:0xc00000c1e0
=========更改数组==========
arr: [1 2 3 4 5 6 7 100 9 10]
sli2: [1 2 3 4 5]
sli3: [4 5 6 7 100]
sli4: [6 7 100 9 10]
sli5: [1 2 3 4 5 6 7 100 9 10]
=========更改切片==========
arr: [1 2 3 4 200 6 7 100 9 10]
sli2: [1 2 3 4 200]
sli3: [4 200 6 7 100]
sli4: [6 7 100 9 10]
sli5: [1 2 3 4 200 6 7 100 9 10]
=========append切片(未超过数组cap)==========
arr: [1 2 3 4 200 0 0 0 9 10]
sli2: [1 2 3 4 200 0 0 0]
sli3: [4 200 0 0 0]
sli4: [0 0 0 9 10]
sli5: [1 2 3 4 200 0 0 0 9 10]
=========append切片(超过数组cap)==========
arr: [1 2 3 4 200 0 0 0 9 10]
sli2: [1 2 3 4 200 0 0 0]
sli3: [4 200 0 0 0]
sli4:[0 0 0 9 111 99 99 99] len:8,cap:10
sli5: [1 2 3 4 200 0 0 0 9 10]
go基础——切片slice的更多相关文章
- python基础——切片
python基础——切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', ...
- Golang 入门 : 切片(slice)
切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...
- 转 Golang 入门 : 切片(slice)
https://www.jianshu.com/p/354fce23b4f0 切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概 ...
- go 数组(array)、切片(slice)、map、结构体(struct)
一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...
- golang切片slice
切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, ...
- 在python&numpy中切片(slice)
在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的操作.此时就 ...
- Go 灵活多变的切片Slice
我们知道数组定义好之后其长度就无法再修改,但是,在实际开发过程中,有时候我们并不知道需要多大的数组,我们期望数组的长度是可变的, 在 Go 中有一种数据结构切片(Slice) 解决了这个问题,它是可变 ...
- 7 切片slice
include 切片 切片的日常用法 切片slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或者 为引用类型. 可以直接创建或从底层数组获取生成. 使用le ...
- go递归函数如何传递数组切片slice
数组切片slice这个东西看起来很美好,真正用起来会发现有诸多的不爽. 第一,数组.数组切片混淆不清,使用方式完全一样,有时候一些特性又完全不一样,搞不清原理很容易误使用. 第二,数组切片的appen ...
随机推荐
- Hadoop组件启停命令和服务链接汇总
1.启停命令 Zookeeper zkServer.sh start zkServer.sh stop/status/restart zkCli.sh -server IP:Port Hadoop(h ...
- Python 国内镜像源
让 python pip 使用国内镜像源 国内镜像源: 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.co ...
- Maven+ajax+SSM实现编辑修改
转载自:https://www.cnblogs.com/kebibuluan/p/9017754.html 3.尚硅谷_SSM高级整合_使用ajax操作实现修改员工的功能 当我们点击编辑案例的时候,我 ...
- ADD software version display
ADD software version display ADD software version display1. Problem Description2. Analysis3. Solutio ...
- 使用.NET 6开发TodoList应用(29)——实现静态字符串本地化功能
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在开发一些需要支持多种语言的应用程序时,我们需要根据切换的语言来对应展示一些静态的字符串字段,在本文中我们暂时不去讨论如何结合 ...
- “伏魔”赏金 | WebShell检测之「模拟污点引擎」首次公测,邀你来战!
安全是一个动态的过程,攻防对抗如同在赛博世界里降妖伏魔,其要义是:取彼之长,补己之短.--伏魔引擎的诞生 伏魔引擎挑战赛 注册时间: 2022.01.10 00:00:00 - 2022.01.24 ...
- Win7升级Win11升级记录及教程 【错误码(0×8004242d)】
hellow,大家好,我是公众号棱镜Prism K的[K君].家中电脑因为一些原因不得不进行升级,下面是我对这次电脑升级所进行的记录. step 1.打开微软官网,找到对应的WIN11下载模块,这里注 ...
- 适配器模式(Adapter模式)
模式的定义与特点 适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作.适配器模式分为类结构型模式和对象结构型模式 ...
- golang中float类型转换成int类型
package main import ( "fmt" "strconv" ) func f2i(f float64) int { i, _ := strcon ...
- 响应的HTTP协议介绍及常见响应码说明
响应的HTTP协议介绍 1,响应行 1)响应的协议和版本号 HTTP/1.1 2)响应状态码 200 3)响应状态描述符 ok 2,响应头 1)key:value 不同的响应头,有其不同含义 空行 3 ...