V语言01基础1
文档在此
注意,32位上不可用.vim高亮
v是静态编译语言.口号:最小抽象,编写简单明了代码.
你好,世界
入口为主,fn声明函数.返回类型在函数后声明.println为数不多内置函数.在一个文件中,可跳过主函数,用于写小的程序.
println ("你好世界")
多文件,按文件夹从主开始,v run .一句编译并运行.运行后会删除可执行,v -keepc run .运行并不删,而v .只编译.注意,编译器参数应在run前.
import os
println(os.args)
//单行注释,/**/嵌套多行注释.注意:不能重载函数.
可在使用后声明函数.对V中所有文件都如此,消除头文件及文件声明顺序.
返回多值
fn foo() (int, int) {
return 2, 3
}
a, b := foo()
println(a) // 2
println(b) // 3
c, _ := foo() //用_忽略
函数默认不可见,要外部使用,加上公.常数/类型也是如此.公只能用在命名模块.
变量用:=声明和初化,V中只能这样声明,即必须初化.
类型从右边推导.用T(v)来转换成T类型.
name := "Bob"
age := 20
large_number := i64(9999999999)
println(name)
println(age)
println(large_number)
v中变量都是局部的,没有全局/模块变量,因而,没有全局状态.
为了一致性,变量和函数名必须这样:snake_case,而类型必须:PascalCase这样.
变量默认不变,可变的话:加上变.
mut age := 20//可变的变
println(age)
age = 21
println(age)
去掉变再编译试试.
:=用于声明+初化,而=为赋值.
fn main() {
age = 21
}
上面不编译,因为未声明变量.所有变量必须声明.
fn main() {
age := 21
}
一行改变多个值,不必第3者.
mut a := 0
mut b := 1
println("$a, $b") // 0, 1
a, b = b, a
println("$a, $b") // 1, 0
开发模式有未用变量警告,生产中禁止编译.
v -prod foo.v.这样.
fn main() {
a := 10
if true {
a := 20 //a重定义
}
//未用a,警告
}
注意:不允许隐藏变量,子域中不能声明父域中变量名字.但你可隐藏导入模块.
import ui
import gg
fn draw(ctx &gg.Context) {
gg := ctx.parent.get_ui().gg
gg.draw_rect(10, 10, 100, 50)
}
V类型
基本类型:
bool
string
i8 i16 int i64 i128 (soon)
byte u16 u32 u64 u128 (soon)
rune //统一码点
f32 f64
voidptr, size_t //与C交互中用
any //类似C的(空*)和`Go`的接口{}
int始终是32位的.例外是:V中操作符两侧变量类型必须相同.较小的一端,自动提升至相匹配的另一端:
i8 → i16 → int → i64
↘ ↘
f32 → f64
↗ ↗
byte → u16 → u32 → u64
↘ ↘ ↘ ptr
i8 → i16 → int → i64
上面为提升路线.整不会变成正.整->浮32会损失精度.当前都是自动转的.
不提升字面量,默认为整/浮64.
u := u16(12)
v := 13 + u // v :`u16`,不提升.
x := f32(45.6)
y := x + 3.14 // x:`f32`不提升.
a := 75 // a:`int`字面默认整
b := 14.7 // b:`f64`字面默认浮64
c := u + a // c:`int`,自动提升u
d := b + x // d:`f64`,自动提升x
串
name := "Bob"
println(name.len)
println(name[0]) //"B"
println(name[1..3]) //切片为串
windows_newline := "\r\n" //与C一样转义
assert windows_newline.len == 2
//断定,连括号都没有?
V中,串是只读字节数组,用utf8编码串数据,串值不变.
mut s := "你好,世界"
s[0] = `H` //不允许,串是不变的,
//rune==>翻译成(符文)
索引是字节,而不是符文.索引与字节相应,而不是统一码的代码点.
rocket := `↘`
assert "aloha!"[0] == `a`
符字面类型为符文(变长码utf8),用反引号来表示符文.单引号和双引号都可用来表示串.为了一致性,vfmt把双引号转成单引号,除非里面有单引号.原始串用r来表示,不转义原始串.
s := r"你好\n世界"
println(s) //
//转整
s := "42"
n := s.int() // 42
//插值串
name := "张三"
println("你好,$name!") //你好,张三!
在变量名前,加上$.变量将转为串并嵌入字面.
字段也可以:"age = $user.age",更复杂,用${}:"可注册=${user.age > 13}".
也支持C的printf(),f,g,x等可选,并指定输出格式,编译器来考虑存储大小,所以没有hd/llu.
x := 123.4567
println("x = ${x:4.2f}")
println("[${x:10}]") // 左间距=> [ 123.457]
println("[${int(x):-10}]")//右间距=> [123 ]
println("[${int(x):010}]")//左0填充=> [0000000123]
串操作符
name := "你好"
bobby := name + "啊" //+连接串
println(bobby) // "你好啊"
mut s := "张三,"
s += "你好" //`+=`用来附加串
println(s) // "张三,你好"
不能连接整至串,因为所有操作符两端类型要一致.
age := 10
println("age = " + age)//禁止
//改成
age := 11
println("age = " + age.str())
//或这样更好
age := 12
println("age = $age")
浙公网安备 33010602011771号