首页 > 其他分享 >Chapter 3.1 复合类型-Arrays,Slices

Chapter 3.1 复合类型-Arrays,Slices

时间:2023-11-21 10:36:36浏览次数:21  
标签:Chapter Slices Arrays 切片 int 数组 var append

数组 Arrays

数组在 Go 中很少被直接使用,因为数组的长度被作为类型的一部分被使用 [3]int [5]int 是不同的类型

这个数组和 C 语言的数组很不一样,C 的数组变量就是指向数组的指针,但是 offset 是 0

你不能使用一个变量代表数组的长度,类型不是在运行时确定的,它必须在编译时确定,这限制了数组在代码中的灵活性
不能使用类型转换在不同 size 的数组之间互相转换
不能写一个 generic 函数处理所有 size 的数组
不能分配不同 size 的数组到同一个变量
通常不使用数组,除非数组的长度是确定的
数组主要作为切片的底层实现,顺便暴漏给程序员偶尔使用

var x [3]int
var x = [3]int{1,2,3}
var x = [12]int{1,5:4,6,7:8} // sparse array [1 0 0 0 0 4 6 8 0 0 0 0]
var x = [...]int{1,3,6} // [1 3 6]
var x [2][3]int // [[0 0 0] [0 0 0]]
x[0] // read
x[0] = 10 // write
len(x) // length

切片 Slices

在 Go 中最常用的用于处理序列 sequence 的数据结构
切片不像数组,它不强制长度作为类型的一部分,所以可以写出处理任意长度序列的泛型函数 generic function

与数组声明方式的区别

var a1 = [...]int{1,2,3,4,5} // [1 2 3 4 5] 数组
var a2 = []int{1,2,3,4,5}    // [1 2 3 4 5] 切片

自动 pdding zero value 的稀疏切片语法

var x1 = []int{1, 5:4, 6, 7:8}  // [1 0 0 0 0 4 6 8] 指定了跳跃的 index,会自动 padding `zero value`

var x2 [][]int // 二维切片
x1[0] = 12 // 使用方括号访问和设置值,另外 go 不支持 python 的负数 offset
var x3 []int // zero value is `nil`

// build-in functions
// go 当中为数不多的内建函数 len append
len(x1) // 8
x1 = append(x1, 20) // [1 0 0 0 0 4 6 8 20]
append(x1, 20, 3, 4, 5) // [1 0 0 0 0 4 6 8 20 3 4 5]

append_test_x := []int{1,2,3}
append_test_y := []int{4,5,6}
append_test_x = append(append_test_x, append_test_y...) // [1 2 3 4 5 6]

nil 表示缺乏值的某种 Type
Capacity 是一个可能会大于数组 len 的,表示切片的内存层的容量上限,也是 Slices 灵活性的一个设计,每一次在 append() 值到 Slices 中的时候,都会进行自动扩容判断,扩容方法通过分配整片的内存空间(整块重新分配后把值重新复制过去,旧的内存空间会被垃圾收集器自动回收处理)

Go 的运行时 runtime 编译到了每一个 build 出来的二进制可执行文件内,不同于依赖虚拟机的语言
因为这个特质使得分发 Go 程序变得更容易,你不用让你的用户去装虚拟机了
自动扩容技术是通过 Go 的运行时 runtime 实现的,Go runtime 还包含其他一些服务:内存分配、垃圾回收、并发支持、网络和内建类型与函数

cap

cap(x1)

Slices 有自增容量的特质,如果你能知道 append 的大致范围,初始化的时候给一个接近的容量的值可以避免一定数量下重复的内存分配与回收

make

x := make([]int, 5) // [0 0 0 0 0]
x := make([]int, 0, 10) // len:0 cap:10

三种声明 Slices 的方式

// zero value
var x []int // nil
var x1 = []int{} // not nil but length is 0

// init value
var y []int{1,2,3} // iterals

// for custom cap
z := make([]int, 0, 100)

使用哪一种所依据的基本原则是:

尽可能减少重复的内存分配与回收次数

对 Slices 进行再切片

变量名[begin:end] begin 取值到 end-1

x := []int{1,2,3,4,5}
y := x[:2] // [1 2]
z := x[1:] // [2 3 4 5]
d := x[1:3] // [2 3]
e := x[:] // [1 2 3 4 5]

注意,再切片只是引用赋值,不是拷贝赋值

append 与引用赋值的 overlapping 效果

x := []int{1, 2, 3, 4} // [1 2 3 4]
y := x[:2] // [1 2]
fmt.Println(cap(x), cap(y))
y = append(y, 30)
fmt.Println("x:", x) // [1 2 3 4]
fmt.Println("y:", y) // [1 2 30]

不要对再切片进行 append 操作
或者
使用全切片表达式 full slice expression 确保 append 不会引起覆盖操作

全切片表达式 full slice expression

y := x[:2:2]
z := x[2:4:4]

标签:Chapter,Slices,Arrays,切片,int,数组,var,append
From: https://www.cnblogs.com/ninkaki/p/17845662.html

相关文章

  • 无涯教程-D语言 - 数组(Arrays)
    D编程语言提供了一种名为arrays的数据结构,该数据结构存储相同类型元素的固定大小的顺序集合,数组用于存储数据集合。声明数组要使用D编程语言声明数组,程序员可以指定元素的类型和数组所需的元素数量,如下所示:typearrayName[arraySize];这称为一维数组,arraySize必须是......
  • 重写Java中Arrays数组工具类提供的sort()排序函数中的比较器类Comparator的compare()
    排序方法是我们日常开发或者写功能函数,或者实现算法时,常调用的方法。有时甚至,开发人员自己还要写一写排序算法。今天,我们来修改Java官方提供的Arrays工具类中的静态排序sort()方法。反问一下,为什么要重写呢?官方提供的还不够你用?回答:确实不够用,官方默认是对数字,特别是sort比较的......
  • Palindrome-less Arrays
    here哥们不会组合数学。首先类似这题,得出没有回文串的充要条件是没有长度为3的回文串。长度为3的回文串,\(a_i,a_{i+1},a_{i+2}\),只要满足\(a_i\neqa_{i+2}\)即可,也就是说奇数位、偶数位抠出来,新数组中相邻的数不相同。考虑dp,一种显然的dp是设\(f_{i,j}\)为\([1,......
  • [USACO23FEB] Equal Sum Subarrays G 题解
    [USACO23FEB]EqualSumSubarraysG题解题目链接\(O(n^5)\)暴力显然,如果修改\(a_i\)的值,只会影响包含\(a_i\)的区间的区间和。于是对于每个\(a_i\),可以将所有区间分成两类,即包含\(a_i\)的区间和不包含\(a_i\)的区间。这两种区间的区间和中最小的差值即为答案。......
  • chapter 13:TCP/IP 和网络编程
    学习笔记:TCP/IP和网络编程13.0摘要本章分为两个部分:TCP/IP协议与应用包括TCP/IP协议栈、IP地址、主机名、DNS、IP数据包和路由器。描述了UDP和TCP协议、端口号以及TCP/IP网络中的数据流。解释了服务器-客户端计算模型和套接字编程接口。通过使用UDP和TCP套接字的示例......
  • Reinforcement Learning Chapter 1
    本文参考《ReinforcementLearning:AnIntroduction(2ndEdition)》Sutton.强化学习是什么传统机器学习方法可分为有监督与无监督两类;有监督学习----->任务驱动无监督学习----->数据驱动强化学习则可看作机器学习的“第三范式”----->模拟驱动,具体而言:通过agent与environm......
  • [CF1895F] Fancy Arrays
    先把存在性容斥一下。变成\([0,\infty]\)减去\([0,x-1]\)和\([x+k,\infty]\)。\([0,x-1]\)的答案显然可以矩阵快速幂\(\mathcalO(x^3\logn)\)求。考虑剩下两个。注意到两个单拎出来都不好求,所以直接求这两个的差。注意到限制在于相邻项的差,于是我们去枚举差分数组,共有......
  • [V8] Holey Arrays
    Whatisholeyarray:anarraywithhole(s)constarray=[1,2,,3]Whythisisaproblem?Shouldarray[2]tobeundefined?Yesandno..normallyitis undefined,butbeforethat,VMhasbeencheck Array.prototypetosee Array.prototype["2"]whethe......
  • chapter 12: 块设备 I/O 和缓冲区管理
    学习笔记摘要本章深入研究了区块设备I/O和缓冲管理,重点介绍了原则、I/O缓冲的优势以及Unix缓冲管理算法的不足之处。提出使用信号量设计更高效的缓冲管理算法,介绍了PV算法作为示例。还提供了一个编程项目,用于比较Unix的缓冲管理算法和PV算法,有助于理解文件系统的I/O......
  • chapter 6:信号和信号处理
    学习笔记6.0摘要这一章由华盛顿州立大学电气工程学院的K.C.Wang编写,涵盖了信号和信号处理。它提供了对信号和中断的统一处理,将信号视为Unix/Linux进程的中断。该章节解释了信号的来源、类型和处理步骤,包括进程结构中的信号处理程序及其在InterprocessCommunication(IPC)中的作......