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 ...
随机推荐
- CGO封装C语言qsort函数
封装qsort函数 package qsort /* #include <stdlib.h> typedef int (*qsort_cmp_func_t) (const void* a, ...
- html基础 有语义的布局标签
- Ubuntu18.04升级内核后修改grub文件启动顺序
采坑:之前线上的服务器内核是4.15.0,后面有的服务跑不起来,说是要升级内核,于是就升级了,然后改了/etc/default/grub的启动顺序,改错了就启动不起来了,哈哈.后面多次尝试还是改成功了 ...
- 解决spring boot 无法访问静态文件夹的附件或图片
1.需要在配置文件重新执行静态文件夹位置即可 # 指定静态文件位置 resources: static-locations: classpath:/static/,classpath:/static/ ...
- ajax 异步 提交 含文件的表单
1.前言 需求是使用 jquery 的 ajax 异步提交表单,当然,不是简单的数据,而是包含文件数据的表单.于是我想到了 new FormData() 的用法, 可是仍然提交失败,原来是ajax的属 ...
- mongodb基础整理篇————简单介绍[一]
前言 简单介绍一下文档数据库. 正文 mongodb 是一个以json为数据模型的文档数据库. 这里要介绍一下什么是json.因为有些人认为'{a:1,b:2}' 是json,而"this ...
- vue js格式化数字为金额格式
/** * @description 格式化金额 * @param number:要格式化的数字 * @param decimals:保留几位小数 默认0位 * @param decPoint:小数点 ...
- VUE3 之 表单元素
1. 概述 老话说的好:行动起来,原地观望是没有用的. 言归正传,今天我们来聊聊 VUE3 的 表单元素. 2. 表单元素 2.1 文本框与数据绑定 <body> <div id=& ...
- 使用.NET 6开发TodoList应用(27)——实现API的Swagger文档化
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在日常开发中,我们需要给前端提供文档化的API接口定义,甚至需要模拟架设一个fake服务用来调试接口字段.或者对于后端开发人员 ...
- 《剑指offer》面试题14- II. 剪绳子 II
问题描述 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] .请问 k[0]*k[1]* ...