基本类型
V语言是一门静态类型,编译型语言,以下是内置的基本类型:
布尔类型
bool,布尔类型,值只能是true或false。
module main
fn main() {
x := true
y := false
println(x) // true
println(y) // false
println(sizeof(bool)) // 1个字节
}布尔类型从定义的C代码看是u8的类型别名。
true是常量1,false是常量0。
使用sizeof(bool)可以看到bool类型的默认长度是1个字节。
typedef uint8_t u8;
...
#ifndef bool
#ifdef CUSTOM_DEFINE_4bytebool
typedef int bool;
#else
typedef u8 bool;
#endif
#define true 1
#define false 0
#endif数值类型
数值类型分为整数和小数。
整数
i8
1字节
-128 到 127
有符号8位整数
i16
2字节
-32,768 到 32,767
有符号16位整数
int
4字节
-2,147,483,648 到 2,147,483,647
int总是32位整数,即i32
i64
8字节
-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
有符号64位整数
isize
arch
等价于C的ptrdiff_t类型,长度取决于运行的计算机架构,64 位是i64,32 位是i32
有符号整数
u8
1字节
0 到 255
无符号8位整数
u16
2字节
0 到 65,535
无符号16位整数
u32
4字节
0 到 4,294,967,295
无符号32位整数
u64
8字节
0 到 18,446,744,073,709,551,615
无符号64位整数
usize
arch
等价于C的size_t类型,长度取决于运行的计算机架构,64位是u64,32 位是u32
无符号整数
小数
f32
4字节
等价于C中的float
32位小数
f64
8字节
等价于C中的double
64位小数
数字可以通过前缀标识对应的进制,也可以增加下划线,进行视觉上的分隔,不影响本来的值。
小数只能使用类似1.0的风格,不允许使用1.的风格,小数点后面的0不允许省略。
如果不希望由编译器自动类型推断,可以通过T(value)的格式,显式声明变量类型,T是类型,value是变量值。
字节类型
字节类型u8,就是单字节byte。
早期的V版本,确实有byte这个类型,是u8的类型别名,后来被声明取消了,因为作者希望坚持one way的原则,目前byte还可以照常使用,但是在不远的将来,会被取消。
字符串类型
string字符串类型,默认不可变,UTF-8编码。
单引号和双引号都可以,习惯上都还是使用单引号,V编译器中的代码都是统一使用的单引号。
按作者的说法是可以少按一个shift键,更自然简单一些,不过打破了之前C的使用习惯,让人一开始有些不习惯。
当使用双引号的时候,编译器会自动把双引号自动替换为单引号。
字符串长度:
字符串连接:
字符串追加:
字符串插值:
判断字符串是否包含子字符串:
遍历字符串:
字符串切片/区间
采用的是左闭右开。
字符串从定义的V源代码代码看,也是通过结构体struct来实现的。
vlib/builtin/string.v:
字符串单引号和双引号混合使用
主要的逻辑是:
以单引号为主要使用的符号,双引号也可以使用。
如果有字符串嵌套使用,内外必须不能同时是单引号或者同时是双引号,不然无法正确配对。
如果有加上反斜杠进行转义,则都可以。
原始字符串
在单引号或双引号前加上小写r,就表示是raw字符串,在原始字符串中不支持插值和转译。
输出:
rune类型
rune是u32的类型别名,用4个字节来表示一个unicode字符/码点,跟string不是同一个类型。
rune使用反引号来表示。
常用字符串内置函数,可以参考后面的标准库章节,也可以直接参考vlib/builtin/string.v源代码。
指针类型
voidptr,通用类型指针,用来存储变量的内存地址,可以保存任何类型的地址。
指针本身占用的内存大小就是C语言里面的size_t类型,通常在32位系统上的长度是32位,64位系统上是64位。
变量前加&表示取内存地址,返回指针类型。
指针类型前加*表示取内存地址对应变量的值。
nil,表示空值或者空指针,等价于voidptr(0)。
正常情况下,由V创建的变量,因为声明和初始化一定是同时进行的,所以变量一定会有初始值。V指针一定不会有空值nil,即voidptr(0)值。
但是通过调用C代码返回的指针,有可能是空指针,所以在使用前可以用isnil(ptr)内置函数判断一下,判断由C代码生成的指针是否是空指针。
在V语言中,指针只是表示引用,不能进行指针运算。
只有在unsafe代码块中,V编译器不进行任何检查,允许指针像C那样可以进行指针运算,指针偏移,多级指针。
详细内容可以参考:不安全代码。
除了voidptr通用类型指针,V还有2种指针类型,一般情况比较少用:字节类型指针byteptr,字符类型指针charptr。
类型推断及类型转换
获取变量和类型占用内存大小
使用内置函数sizeof来获取变量和类型占用内存大小:
普通函数,获取变量的占用内存大小
sizeof(var)
泛型函数,获取类型的占用内存大小
sizeof[T]()
获取变量和类型的类型信息
使用内置函数typeof来返回变量的类型和类型的idx和name
普通函数,获取变量的类型的idx和name
typeof(var).nametypeof(var).idxvar.type_name()
泛型函数,获取类型的类型的idx和name
typeof[T]().nametypeof[T]().idx
获取类型的idx和name:
判断变量和类型是否为引用类型
普通函数,判断变量是否为引用类型
isreftype(var)泛型函数,判断类型是否为引用类型
isreftype[T]()
判断类型是否为引用类型:
最后更新于
这有帮助吗?