数组
除了内置的基本类型外,数组和字典也是内置类型。
数组实现
从数组的源代码实现看,也是一个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。
最后更新于
这有帮助吗?