name := 'Bob'
age := 20
large_number := i64(9999999999)
println(name)
println(age)
println(large_number)
变量通过 :=
来声明与初始化。这是在 V 中声明变量的唯一方式。这也意味着声明变量时必须赋初始值。
变量的类型会通过 :=
右边的值自动推断出来。想要选择不同的类型,使用类型转换:表达式 T(v)
将值 v
转换成类型 T
。
与其他编程语言不同,V 只允许在函数中定义变量。全局变量(模块层级)是不允许的,V 中没有全局状态。
为了在不同的代码库之间保持一致性,所有变量和函数名都必须使用 snake_case
样式,而类型名必须使用 PascalCase
。
mut age := 20
println(age)
age = 21
println(age)
改变变量值使用 =
。在 V 中,变量默认都是不可变的。想要定义可改变值的变量,需要通过 mut
声明。
试着去掉第一行的 mut
之后再次运行上面代码。
注意 :=
与 =
之间的(重要)区别。:=
用来声明与初始化变量值,=
用来赋值。
fn main() {
age = 21
}
这段代码无法编译,因为变量 age
没有声明。V 中所有变量都需要声明。
fn main() {
age := 21
}
可以在一行代码内改变多个变量的值。这样,两个变量进行值交换不需要借助中间变量就可以完成。
mut a := 0
mut b := 1
println('$a, $b') // 0, 1
a, b = b, a
println('$a, $b') // 1, 0
开发模式中编译器会警告你没有使用某个变量(你会收到“unused variable”警告)。生产模式中(通过传递 -prod
标志给 v 比如 v -prod foo.v
来打开)根本不会编译(就像 Go 那样)。
fn main() {
a := 10
if true {
a := 20 // error: redefinition of `a`
}
// warning: unused variable `a`
}
与大多数语言不同,V 不允许变量重复(variable shadowing)。使用已在父范围中使用的名称来声明变量将导致编译错误。
但是你可以重复使用导入的模块名来声明变量,一些场合下非常有用:
import ui
import gg
fn draw(ctx &gg.Context) {
gg := ctx.parent.get_ui().gg
gg.draw_rect(10, 10, 100, 50)
}