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")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现