数组

除了内置的基本类型外,数组和字典也是内置类型。

数组实现

从数组的源代码实现看,也是一个struct。

vlib/builtin/array.v

struct array {
pub: //公共只读
	data voidptr //数组的起始指针
	len int //数组的长度
	cap int //数组的容量
	element_size int //数组元素的字节大小
}
arr := [1,2,3,4,5]  //字面量定义数组
println(arr.data) //返回数组地址:0x7ff0d2c01270
println(arr.len)  //返回5
println(arr.cap)  //返回5
println(arr.element_size) //返回4

数组定义

根据首个元素的类型来决定数组的类型,

[1, 2, 3]的数组类型是[ ]int,

['a', 'b']的数组类型是[ ]string,

数组元素的类型必须是一样的,不允许异构数组,[1, 'a'] 编译不会通过。

固定长度数组

对于固定长度数组来说,长度也是类型的一部分,[5]int和[6]int是两个不同的类型。

固定长度数组无法使用<<追加元素。

数组初始化

可以在定义数组时明确指定len,cap,init进行初始化。

也可以使用数组的索引值it,it是iterator迭代器的缩写,来动态地初始化数组元素值。

定义一个指定长度,指定默认值的数组:

数组的追加运算符:<<可以把一个元素追加到数组中,也可以把一个数组追加到数组中。

实际使用中需要注意的是 << 运算符是采用值复制的方式追加到数组中。

指针类型数组:

in操作符

判断元素是否在数组里:

!in操作符

in的反操作符,判断元素是否不在数组里:

遍历数组:

数组切片/区间

左闭右开原则:

函数调用后连写数组区间:

访问数组的错误处理

当访问数组成员的索引越界或者别的错误,可以使用or代码块来进行错误处理。

if语句判断数组成员是否存在

数组解构赋值

目前数组的解构赋值只能用在传递给不确定参数函数,不像js中那样灵活。

数组排序

V语言提供了一个内置的数组排序语法,不仅可以对基本类型数组进行排序,也可以对结构体类型数组进行排序。

数组内置函数

filter( ),map( ),any( ),all( )这四个内置函数都是在编译器内部实现的,比较特殊,

具体用法参考标准库章节

多维数组

维度的数量不仅仅于1,2维,不限:


数组相关的源代码可以参考:vlib/builtin/array.v。

更多数组相关函数,参考标准库arrays模块

最后更新于

这有帮助吗?