Go - 切片(Slice)

定义

切片本身不是数组,它指向底层的数组或者数组的一部分。因此,可以使用Slice来处理变长数组的应用场景。 Silice 是一种引用类型。

1、定义一个空的Slice

package main

import (
    "fmt"
)

func main() {
    var slice1 []int //定义一个Slice, []里面什么也没有!!
    fmt.Println(slice1)
}

2、 从数组中干获取Slice

func main() {

    arr := [3]int32{1, 2, 3} // 定义一个数组
    slice := arr[0:len(arr)] //从数组中取得Slice,从0开始,取到结束
    fmt.Println(slice)
}

//output
[1 2 3]

3、使用“make”关键字创建Slice

make([]T, len, cap)

[]T - 表示定义那种类型的Slice

len - 表示Slice的长度

cap - 表示Slice的容量;可以省略,即cap=len

s1 := make([]int, 3, 5)
fmt.Println(s1)

//output
[0 0 0]

Slice与底层数组的关系图

通过关系图,我们可以得出: Slice_a 长度为3,容量为9, Slice_b 长度为2,容量为8

Reslice

有 Slice 再次生成的Slice。它的特点是:

1. 索引以Slice为准。

2. cap不能超过Slice

3. 索引越界不会从新分配内存,而是直接出错!!

a2 := [5]byte{‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘}
s2 := a2[0:3]
fmt.Println(len(s2), cap(s2)) // output 3, 5

s22 := s2[0:2]
fmt.Println(len(s22), cap(s22)) // output 2, 5

Append 函数

a3 := make([]int32, 2, 4)
fmt.Printf("%v, %p\n", a3, a3)

a3 = append(a3, 1, 2)
fmt.Printf("%v, %p\n", a3, a3)

a3 = append(a3, 1, 2)
fmt.Printf("%v, %p\n", a3, a3)

//output
[0 0], 0x114821d0
[0 0 1 2], 0x114821d0
[0 0 1 2 1 2], 0x11489c60

copy 函数

copy(src, dst) - 将dest的切片 copy 到 src, 以两者之中最短的切片长度为准。

a1 := []int32{1, 2}
a2 := []int32{3, 4, 5}
fmt.Println(a1) // output [1 2]

copy(a1, a2)
fmt.Println(a1) // output [3 4]

copy(a1[0:2], a2[1:3]) // // output [4 5]
fmt.Println(a1)
时间: 2024-08-03 02:05:35

Go - 切片(Slice)的相关文章

golang切片slice

切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, 10) //元素的类型,元素的数量,元素的容量  fmt.Println(len(s2), cap(s2)) 输出元素的数量和容量 2.讲数组转换成切片 2 a := [10]int{} 3 fmt.Println(a) 4 s1 := a[:10] //取前10个元素 [5:]取 5-最后的元素

Go语言之切片Slice练习

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

Go 灵活多变的切片Slice

我们知道数组定义好之后其长度就无法再修改,但是,在实际开发过程中,有时候我们并不知道需要多大的数组,我们期望数组的长度是可变的, 在 Go 中有一种数据结构切片(Slice) 解决了这个问题,它是可变长的,可以随时向Slice 里面添加数据. 1 什么是切片(Slice) 在 Go 源码中是这样定义切片的,源码地址:https://github.com/golang/go/blob/master/src/runtime/slice.go type slice struct { array uns

Golang 入门 : 切片(slice)

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

(一)Python入门-2编程基本概念:16字符串-切片slice操作-逆序

一:字符串切片slice操作 切片 slice 操作可以让我们快速的提取子字符串.标准格式为: [起始偏移量start:终止偏移量end:步长 step] 典型操作(三个量为正数的情况)如下: 操作和说明 示例 结果 [:] 提取整个字符串 “abcdef”[:] “abcdef” [start:]从start 索引开始到结尾 “abcdef”[2:] “cdef” [:end]从头开始直到end-1 “abcdef”[:2] “ab” [start:end]从start 到 end-1  “a

数组array和切片(slice)的区别

一 数组简介: 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的参数传入时将复制一份数组而不是引用同一指针.数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度.注意:和C中的数组相比,又是有一些不同的 1. Go中的数组是值类型,换句话说,如果你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份2. 如果Go中的数组作为函数的参数,那么实际传递的参数是

Python 切片(slice)的扩展使用方法

# -*- coding: utf-8 -*- __author__ = 'xy' #切片(slice)的扩展使用方法 #1 用步长索引来进行扩展的切片操作 # slice[1:2:3]其中第3个位置表示步长,默认为1 #简单的str翻转: s = 'abcde' print s[::-1] # >>>'edcba' #间隔一个字符取值: print s[::2] # >>>'ace' #2 切片索引不越界 print ('a', 'b', 'c')[-100:100]

JS的数组进行切片slice

代码 var arr = new Array(6) arr[0] = "George" arr[1] = "John" arr[2] = "Thomas" arr[3] = "James" arr[4] = "Adrew" arr.slice(0,3) 和pyhon一样,左包含,又不包含,字符串也支持,因为字符串是特殊的数组 原文地址:https://www.cnblogs.com/robinunix/p/

Python~切片Slice

      [:] [:10] [-10:]       [':10:2]                                  

Go语言切片初识

Go切片(Slice)是Go数组的一个抽象. 由于Go数组允许定义类型的变量,可以容纳相同数据类型的几个数据项,但它不提供任何内置的方法来动态增加其大小或获取自己的子数组.切片就没有这样的限制. 它提供了数组所需的许多实用功能,并广泛用于Go编程. 定义切片     var numbers []int /* 未指定大小 */     /* numbers == []int{0,0,0,0,0}*/     numbers = make([]int,6,6) /* 长度是6容量是6的切片*/ le