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")
posted @   zjh6  阅读(36)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示