基本类型

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).name

    • typeof(var).idx

    • var.type_name()

  • 泛型函数,获取类型的类型的idx和name

    • typeof[T]().name

    • typeof[T]().idx

获取类型的idx和name:

判断变量和类型是否为引用类型

  • 普通函数,判断变量是否为引用类型

    isreftype(var)

  • 泛型函数,判断类型是否为引用类型

    isreftype[T]()

判断类型是否为引用类型:

最后更新于

这有帮助吗?